Порядок элементов объекта в Firefox (перечисление JS)

Перечисление объектов JS кажется непоследовательным в Firefox.

Код:

var a = {"3":"a", "2":"b", "foo":"c", "1":"d"};

var str = "";
for(var n in a) { str += n + " = " + a[n] + "\n"; }
alert(str);

Результат с FF22 в Windows:

1 = d
2 = b
3 = a
foo = c

Ожидаемый результат (и то, что я получаю с FF20 на Linux):

3 = a
2 = b
foo = c
1 = d

Как сохранить элементы в том же порядке, что и вставляемые?

Я знаю, что спецификация ECMA не говорит, как следует перечислять, поэтому ее нельзя назвать ошибкой. Но мне нужны элементы в введенном порядке. (Причина: Я получаю JSON-кодированную хеш-таблицу, которая упорядочена на стороне сервера. До недавнего времени заказ сохранялся, теперь весь список беспорядок, потому что он упорядочивается ключами)

1 ответ

Нет, ты не можешь этого понять. Порядок ключей в объекте не определен и может быть любым желанием JS.

Однако вы можете сортировать ключи:

var a = {"3":"a", "2":"b", "foo":"c", "1":"d"};

var str = "";
for(var n in Object.keys(a).sort(your_sorting_function)) {
 str += n + " = " + a[n] + "\n";
}
alert(str);

your_sorting_function должен принимать два аргумента, которые эффективно будут имена ключей в a объекта. Затем эта функция должна возвращать 0 для идентичных ключей 1 если первый ключ считается "больше" и -1 противном случае.

Object.keys() не существует во всех браузерах, но существует множество реализаций, которые можно найти.

Например:

Object.keys = Object.keys || function(o) { 
 var result = []; 
 for(var name in o) { 
 if (o.hasOwnProperty(name)) 
 result.push(name); 
 } 
 return result; 
};

licensed under cc by-sa 3.0 with attribution.