Можно ли заставить Chrome повторять «строковые числовые» ключи в порядке их хранения? - PullRequest
3 голосов
/ 14 января 2011

У меня, кажется, есть интересная проблема только в Chrome (не IE, FF). Дан следующий объект:

var myObj = {
  "59" : "Hello",
  "52" : "and",
  "50" : "how",
  "31" : "are",
  "65" : "you"
};

Обход объекта через цикл for выплевывает содержимое в следующем порядке:

for(var j in myObj) {  document.write(myObj[j] +', '); }

are, how, and, hello, you

Все остальные крупные браузеры дают его в «правильном» порядке. Chrome рассматривает ключи как целые числа вместо строк. Проблема в том, что у меня есть источник данных json, который я не могу изменить, и мне нужно получить доступ к элементам в том порядке, в котором они находятся в объекте.

Кто-нибудь может предложить способ сделать это в Google Chrome?

Ответы [ 2 ]

5 голосов
/ 14 января 2011

При переборе объекта с помощью for...in порядок свойств не гарантируется.Вы ничего не можете сделать:

Цикл for...in перебирает свойства объекта в произвольном порядке (см. Оператор delete , чтобы узнать, почему нельзя зависетьна кажущийся порядок итерации, по крайней мере, в кросс-браузерной настройке).

А со страницы delete:

Хотя ECMAScript делает порядок итераций объектовВ зависимости от реализации может показаться, что все основные браузеры поддерживают порядок итераций, основанный на самом раннем добавленном свойстве, которое идет первым (по крайней мере, для свойств, не относящихся к прототипу).Тем не менее, в случае Internet Explorer, когда кто-то использует delete для свойства, возникает некоторое запутанное поведение, не позволяющее другим браузерам использовать простые объекты, такие как литералы объектов, в качестве упорядоченных ассоциативных массивов.В Проводнике, хотя значение свойства действительно установлено как неопределенное, если позднее оно добавит свойство с тем же именем, свойство будет повторяться в его старой позиции, а не в конце последовательности итерации, как можно было ожидать после того, какудалил свойство, а затем добавил его обратно.

Поэтому, если вы хотите смоделировать упорядоченный ассоциативный массив в кросс-браузерной среде, вы вынуждены либо использовать два отдельных массива (один для ключей, а другой длязначения) или создать массив объектов с одним свойством и т. д.

4 голосов
/ 14 января 2011

Если вы хотите узнать, почему это так, не стесняйтесь читать очень длинное обсуждение в V8 Issue Tracker " Неправильный порядок в свойствах объекта intere ":

http://code.google.com/p/v8/issues/detail?id=164

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...