Порядок итерации отличается в IE9 - PullRequest
2 голосов
/ 30 марта 2012

В IE9 числовые ключи свойств объекта сортируются, что приводит к другому порядку итерации в IE9 по сравнению с IE8, где порядок сохраняется при вставке.

var obj = {
  "5": "John",
  "1": "Kumar",
  "3": "Rajesh",
  "2": "Yogesh"
}

for(var key in obj) alert(key) 

Результат

// 1,2,3,4 в IE9

// 5,1,3,2 в IE8, IE7

Есть ли возможность отключить автоматическую сортировку в IE9? Если нет, то можно ли как-то заставить браузер понять, что ключи должны быть определены как строки, а не как числа (но без добавления пробела, _ или любых других специальных символов)

Пожалуйста, предложите !!

Вот пример кода, где я сталкиваюсь с этой проблемой.

    function Person(id, name) {
    this.id = id;
    this.name = name;
}

var persons = new Object();

var p1 = Person("5","John")
persons[5]=p1
var p2 = Person("1","Kumar")
persons[1]=p2  
var p3 = Person("3","Rajesh")
persons[3]=p3
var p4 = Person("4","Yogesh")
persons[4]=p4


for(var id in personId){
   var p = persons[id];
   var option = new Option(p.name, p.id);
   select.options[select.options.length] = option;
}

Параметры выбора, сгенерированные этим сценарием, были отсортированы по идентификатору в IE9, где мне нужен тот же порядок, в котором он вставлен.

1 Ответ

9 голосов
/ 30 марта 2012

Порядок перечисления свойств не определен в ECMAScript до версии 5 включительно (текущей версии на момент написания) и зависит от браузера, поэтому не стоит полагаться на какой-либо конкретный порядок.Если вам нужно предсказуемое упорядочение, используйте массив и цикл for или while.Для вашего примера один из вариантов будет:

var arr = [
  {rank: "5", name: "John"},
  {rank: "1", name: "Kumar"},
  {rank: "3", name: "Rajesh"},
  {rank: "2", name: "Yogesh"}
];

for (var i = 0; i < arr.length; ++i) alert(arr[i].rank);

Последнее замечание: порядок перечисления при использовании цикла for...in не гарантируется для любого типа объектов, включая массивы, поэтому вы всегда должны использовать for или while когда заказ имеет значение.

...