Chrome, переупорядочивающий объектные ключи, если численные данные, настолько нормальный/ожидает

Я заметил, что определенный код, который оценивает некоторые размеры обуви для сайта электронной коммерции и производит их на экране, портит порядок в Chrome.

Данный JSON может быть:

{
  "7": ["9149", "9139", "10455", "17208"],
  "7.5": ["9140", "9150", "10456", "17209"],
  "8": ["2684", "9141", "10457", "17210"],
  "8.5": ["9142", "10444", "10458", "17211"],
  "9": ["2685", "9143", "10459", "17212"],
  "9.5": ["10443", "9144", "10460", "17213"]
}

... который увеличивает размеры в половинах.

На преобразование в объект и итерацию, хотя ключи, естественный порядок уважают и они выходят как:

7, 7.5, 8, 8.5 и т.д.

Но в Chrome только, ключи, которые 'смотрят' как круглые числа ВСЕГДА, выходят из объекта сначала, таким образом, вывод для... в цикле:

7, 8, 9, 7.5, 8.5, 9.5...

Object.keys(sizes); // ["7", "8", "9", "7.5", "8.5", "9.5"]

Вот тестовый сценарий: https://jsfiddle.net/wcapc46L/1/

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

При добавлении префикса объектных ключей какой-либо символ порядок остается незатронутым и работает, как предназначено - FIFO

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

Какие-либо идеи? действительно ли это вероятно ошибка, которая будет исправлена?

отредактируйте дополнительно, я теперь обнаружил это как проблему о v8 средстве отслеживания ошибки:

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

Похож на Мигание, не хотят фиксировать это и останется единственным браузером, который сделает это.

обновите любую оптимизацию хеш-таблицы, которую имел WebKit/мигание, теперь превратил его путь в геккона (FF 27.0.1) - результаты http://jsfiddle.net/9Htmq/ в 7,8,9,7.5,8.5,9.5. применение _ перед возвратами ключей корректное / ожидаемый порядок.

обновление, которое 2 017 Человек все еще upvoting и редактирующий это так - Это, кажется, не влияет Map / WeakMap, Set и т.д. (как продемонстрировано обновленным основным примером)

25
задан Dimitar Christoff 27 September 2017 в 21:10
поделиться

5 ответов

Так v8 обрабатывает ассоциативные массивы. Известная проблема Проблема 164 , но она соответствует спецификации, поэтому помечена как «работает по назначению». Для циклического перебора ассоциативных массивов нет обязательного порядка.

Простой обходной путь - предшествовать числовым значениям буквами, например: 'size_7': ['9149', '9139'] и т. Д.

Стандарт будет изменен в следующей спецификации ECMAScript, заставив [ chrome], чтобы изменить это.

21
ответ дан 28 November 2019 в 21:48
поделиться

Похоже, что Chrome обрабатывает строку integer как числовой тип при использовании в качестве имени индекса/свойства.

Я думаю, что полагаться на реализацию Javascript для сохранения порядка того, что в некоторых случаях является свойствами объекта, а в других случаях (конечно, с хромом) индексами массива, очевидно, является небезопасным подходом, и порядок перечисления, вероятно, не определен в спецификации. Я бы предложил добавить в JSON дополнительное свойство, указывающее порядок сортировки:

{
    "7":{"sortOrder":1,"data":["9149","9139","10455","17208"]},
    "7.5":{"sortOrder":2,"data":["9140","9150","10456","17209"]}
    //etc
}
1
ответ дан 28 November 2019 в 21:48
поделиться

Они рассматриваются как строки, потому что они являются строками. Я бы посоветовал использовать одинаковую "точность" во всех ключах.

{"7.0":["9149","9139","10455","17208"],"7.5":["9140","9150","10456","17209"],"8.0":["2684","9141","10457","17210"],"8.5":["9142","10444","10458","17211"],"9.0":["2685","9143","10459","17212"],"9.5":["10443","9144","10460","17213"]}

Например, "8.0" вместо "8" и т.д.

Даже в этом случае нет никаких гарантий, но более вероятно, что они выйдут в том же порядке.

Для большей гарантии выполните сортировку по ключам, поместив значения в массив в отсортированном порядке.

1
ответ дан 28 November 2019 в 21:48
поделиться

При итерации свойств объекта порядок указывается в спецификации ECMAScript как неопределенный, и на любой порядок, который вы могли наблюдать в некоторой среде, не следует полагаться. Если вам нужен порядок, используйте массив .

1
ответ дан 28 November 2019 в 21:48
поделиться

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

0
ответ дан 28 November 2019 в 21:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: