Хром сортирует свойства в хеше

Привет, ребята. Такой вопрос. В Хроме есть проблема — он сортирует свойства в хеше. Например,
var hash = {
  1 : 'один',
  3: 'три',
  2: 'два'
};
for (var i in hash) alert(hash[i]); 

Выведет «один, два, три», хотя ожидается совершенно другой порядок.

Другой пример[].associate из MooTools:
Array.prototype.associate = function(keys){
    var obj = {}, length = Math.min(this.length, keys.length);
    for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
    return obj;
};

var hash = ['one', 'three', 'two'].associate(['first','3','2']);

var string = '';

for (var i in hash) string += i + ':' + hash[i] + '; ';

alert(string);
// Chrome: 2:two; 3:three; first:one;
// Other : first:one; 3:three; 2:two;



Я считаю такое поведение совершенно нелогичным и, как минимум, не кроссбраузерным и потому хотелось бы найти способ заставить Хром не заниматься самодеятельностью и сортировать свойства в таком порядке, который я задаю, а не алфавитном.
Есть идеи, как это сделать?
  • Вопрос задан
  • 2829 просмотров
Пригласить эксперта
Ответы на вопрос 8
Не знаю, как насчет браузеров, но обычно хеши не гарантируют никакого конкретного порядка элементов — ни исходного, ни отсортированного. Слишком накладно может оказаться делать и быстрый поиск по ключу (для чего, собственно, и предназначен хеш), и хранить оригинальный порядок элементов.
Ответ написан
@my_own_parasite
из ECMA-262:

12.6.4 The for-in Statement

The mechanics and order of enumerating the properties (step 6.a in the first algorithm, step 7.a in the second) is not specified.


самодеятельность прописана в стандарте. поэтому считать случайное нужное вам поведение for in в других браузерах «стандартным» нельзя :)
Ответ написан
azproduction
@azproduction
TheShock, это фича/баг хрома(мб WebKit) в остальных браузерах все как и было раньше. Смирись он есть давно.
Ответ написан
Комментировать
@TimTowdy
Выведет «один, два, три», хотя ожидается совершенно другой порядок.
Что значит ожидается? Порядок в хешах не может ожидаться. Даже если один и тот же хеш сегодня выведет 1,2,3, а завтра 2,1,3 — это вполне нормальное поведение.
Я считаю такое поведение совершенно нелогичным и, как минимум, не кроссбраузерным
А я считаю что сортировка пузырьком должна иметь сложность O(1). Как разработчиков хрома заставить изменить законы природы?
Вы имеете удивительную наглость требовать какое-то поведение от хеша, не понимая принципов его работы.

Нужен гарантированный порядок выборки из хеша — берите все его ключи, сортируйте, и обращайтесь по очереди. Нужна выборка в порядке вставки — храните отдельно массив с ключами.
Ответ написан
Комментировать
opium
@opium
Просто люблю качественно работать
По мойму можно удариться об стену если надеяться на порядок ключей в хеше.
Ответ написан
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Opera тоже не сортирует (как минимум, некоторые версии). Если это так в IE и FF — это просто особенности данных имплементаций. Вроде даже в стандарте указано, что порядок извлечения не гарантируется.
Да и вообще словари сроду не сортировались нигде (кроме, может, PHP).
Ответ написан
Комментировать
mraleph
@mraleph
Это не алфавитный порядок. Сначала все числовые свойства в порядке номеров, потом все нечисловые в порядке вставки.

Ишуй в багтрекере V8 (резолюция Working As Intended): code.google.com/p/v8/issues/detail?id=164

Новый стандарт JavaScript скорее всего будет специфицировать именно такое поведение: wiki.ecmascript.org/doku.php?id=strawman:enumeration

Хотите сохранять порядок ключей, храните ключи рядом в массиве в нужном вам порядке и используйте при итерации.
Ответ написан
Комментировать
@mishutkiss
в первом примере Вы задаете жесткую последовательность: первому свойству ОДИН, второму ДВА, третьему ТРИ только в разном порядке и логично ожидать именно такого результата

var hash = {
1: 'один',
3: 'три',
2: 'два'
};
равносильно

var hash = {
1: 'один',
2: 'два',
3: 'три'
};
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы