Порядок данных jQuery getJSON варьируется в зависимости от браузера - PullRequest
4 голосов
/ 14 сентября 2011

Данные JSON:

  {"2":"Alpha","1":"Beta"}

Формат данных фиксированный, т.е. я не могу его изменить, я могу только изменить код javascript / jQuery.

    $.getJSON("www.myurl.com", function(data) {
        var items = [];
        $.each(data, function(key, val) {
            items.push(key + ', ' + val);
        });
        alert(items);
    });

Chrome,IE9 и Opera отображают: 1, бета, 2, альфа

Firefox и Safari: 2, альфа, 1, бета

Вопрос 1: Что правильно?

Вопрос 2: Я хочу, чтобы данные были упорядочены как в Firefox и Safari.Какой самый простой способ для меня обеспечить, чтобы Chrome, IE9 и Opera производили одинаковый вывод, как Firefox и Safari?

Ответы [ 3 ]

2 голосов
/ 14 сентября 2011

$.each работает с массивами javascript (индексы представляют собой целые числа на основе 0). Показанный вами JSON не является массивом. Это ассоциативный массив, представляющий собой объекты javascript. Итак:

$.getJSON("www.myurl.com", function(data) {
    var items = [];
    for (var prop in data) {
        if (data.hasOwnProperty(prop)) {
            items.push(prop + ', ' + data[prop]);
        }
    }
    alert(items);
});

Или, если вы хотите использовать $.each, используйте массивы, например:

["Alpha", "Beta"]

и затем:

$.getJSON("www.myurl.com", function(data) {
    var items = [];
    $.each(data, function(index, element))
        items.push(index + ', ' + element);
    }
    alert(items);
});
1 голос
/ 14 сентября 2011

не знаю ... но вы можете отсортировать массив по факту.

с учетом следующего вывода (смоделированного для тестирования)

var items = ["1, Beta", "2, Alpha"]

Вы можете

items.sort(function(a,b){ return b.split(",")[0] - a.split(",")[0] })
0 голосов
/ 14 сентября 2011

Я бы перестроил ваш ответ на что-то вроде этого:

[
  {
    "key":"2",
    "value":"Alpha"
  },
  {
    "key":"1",
    "value":"Beta"
  }
]

использование массива обеспечит сохранение порядка.

...