Измените порядок для .each () в Firefox и Chrome - PullRequest
5 голосов
/ 23 марта 2012

У меня есть веб-сервис, который возвращает JSON-кодированный массив данных. Затем я использую функцию jQuery .each() для итераций по этому массиву, но в Firefox он выполняет итерацию вниз, а в Chrome - итерацию вверх.

данные, возвращаемые веб-службой:

{
  "data": {
    "610": {
      "id": "610",
      "url": "a url 1",
      "description": "XXX YYY",
      "toc": "0000-01-00",
      "active": "1"
    },
    "608": {
      "id": "608",
      "url": "a url 1",
      "description": "ytttgffrr",
      "toc": "0000-01-00",
      "active": "1"
    },
    "607": {
      "id": "607",
      "url": "a url  3",
      "description": "rtretert3",
      "toc": "0000-01-00",
      "active": "1"
    },
    "606": {
      "id": "606",
      "url": "a url 4",
      "description": "xxxwwww",
      "toc": "0000-01-00",
      "active": "1"
    },
    ...
  }
}

Firefox идет 610 -> 606, в то время как Chrome Fors 606 -> 610.

Есть идеи, почему и что я могу с этим поделать?

Ответы [ 2 ]

7 голосов
/ 23 марта 2012

Свойства объектов не имеют внутреннего порядка. Спецификация ECMAScript не гарантирует, что операторы for…in пройдут объект по его свойствам в алфавитном порядке. jQuery.each использует for…in под капотом при использовании на объектах.

Если порядок важен для вас, используйте массив вместо объекта.

0 голосов
/ 23 марта 2012

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

В ES5 вы можете сделать это просто, используя Object.keys();

var keys = Object.keys(yourObj).sort();

for (var i=0;i<keys.length;i++) {
    // use yourObj[keys[i]]; guaranteed to be in the right order
}

Если вы не используете прокладку HTML5 или не можете использовать Object.keys() polyfiller , достаточно for in;

var keys = [];

for (var x in yourObj) {
    yourObj.hasOwnProperty(x) && keys.push(x);
}

keys.sort();

for (var i=0;i<keys.length;i++) {
    // use yourObj[keys[i]]; guaranteed to be in the right order
}

Конечно, функция sort() объекта Array позволяет вам указать функцию для пользовательского порядка сортировки.Вы также можете использовать reverse() для изменения порядка ключей.

...