Направление объекта jQuery parseJson (IE и Firefox против Opera и Chrome) - PullRequest
1 голос
/ 25 октября 2011

AJAX-запрос возвращает строку JSON, например: {"1015": {some data here}, "1001": {some data here} - это PHP-массив в формате JSON.

jQuery.parseJSON функция возвращает объект Javascript и смотрит, где проблема: IE8 и FF4 возвращают объект с тем же порядком элементов: 1015, 1001 (что я считаю правильным способом), но Opera11 и Chrome14 возвращают объект с противоположным порядком: 1001, 1015 (но обработанная строка JSON остается той же).

Есть ли решение этой проблемы?

1 Ответ

5 голосов
/ 25 октября 2011

Это не проблема браузера, а злоупотребление структурами данных.

Массив - это упорядоченный набор объектов.Коллекция / объект javascript по определению является неупорядоченным набором.Стандарт ECMA подтверждает это.

Существует относительно древняя проблема проекта Chromium V8, в которой обсуждается длительная тема: http://code.google.com/p/v8/issues/detail?id=164

Суть в том, что Chrome иOpera (и IE9 на самом деле) сортируют элементы вашего объекта с числовыми ключами и помещают их перед любыми членами с помощью строковых ключей.Это сделано из соображений эффективности при доступе к объекту и работает так, как задумано в этих браузерах.FF и IE <9 сохраняют порядок структуры, которую не следует упорядочивать, и хотя они не делают ничего плохого, это поведение менее правильно, чем в Chrome, Opera и IE9.</p>

У вас есть три способа решения этой проблемы в вашем проекте:

  1. Вызовите array_values ​​() для ваших данных, чтобы сделать их неассоциативными.Когда вы json_encode, по умолчанию он будет закодирован как массив.Тогда порядок будет таким, каким он был определен в PHP.Поскольку вы не хотите терять свои ключи, вы должны хранить их в данных объекта.Это предпочтительное решение, которое с наименьшей вероятностью сломается в долгосрочной перспективе.

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

  3. Преобразуйте ключи в строки с некоторым буквенным символом наначало или конец каждой клавиши.Это хороший вариант, если вы работаете с унаследованным проектом и практически не управляете своей архитектурой.

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

Мораль истории: если вам нужно сохранить порядок, используйте массив.

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