ie9 начал сам сортировать массивы
Здравствуйте.
Не знаю с чем это связано, но с недавнего времени изменилось поведение for( in ) в IE. вот код var arr = new Array(); arr['555'] = "Первый"; arr['777'] = "Второй"; arr['666'] = "Третий"; for (var i in arr) { alert(i + ':' + arr[i] + '; '); } который в Firefox и Seamonkey, как и раньше (и как в предыдущих IE) выводит: 555:Первый 777:Второй 666:Третий в новых же IE9, Хроме и Опере вывод такой: 555:Первый 666:Третий 777:Второй т.е. массив отсортирован по ключам, а мне это совершенно ни к чему. Подскажите, плз, можно ли как-то предотвратить эту автосортировку для for( in )? |
1. У вас не массив а хэш.
2. Порядок ключей в хэше не гарантирован и может быть произволен. |
хорошо, пусть Хеш.
Проблема в том, что IE до 9 версии его не сортировали, а новый - сортирует. Можно ли это как-то предотвратить? |
Aetae,
т.е. как бы получается, что ваше второе утверждение для новых ie, хром и оперы неверно - порядок непроизволен. |
Цитата:
Цитата:
|
Цитата:
Если такое использование хэшей категорически неправильное, может быть порекомендуете какие-то рабочие методы? |
Методы зависят от задачи.
Цитата:
|
задача-то простая )
выбирать их хеша arr['555'] = "Первый"; arr['777'] = "Второй"; arr['666'] = "Третий"; элементы в том порядке, в котором они объявлялись |
Цитата:
var arr = [ {id: '555', name: 'Первый'}, {id: '777', name: 'Второй'}, {id: '666', name: 'Третий'} ], i, len; for (i = 0, len = arr.length; i < len; i += 1) { alert(arr[i].id + ':' + arr[i].name + '; '); } |
Pavel M.,
спасибо, то что нужно! |
Проще записать
var arr = {555:'Первый',777: 'Второй',666: 'Третий'}; for (var i in arr) { alert(i + ':' + arr[i] + '; ');} Зачем создавать лишении свойства, объекты используют в коллекции также имена и свойства. кто муже поведение IE можно включить меньшей версии из тела документа. |
UDN, и наступите на грабли какого-нибудь IE13, который будет, например, вообще каждый раз в случайном порядке выводить.
Уже было сказано, что на какой-либо порядок при переборе for-in рассчитывать не стоит. |
Цитата:
Какай идиот при создание ПО станет создавать еще и генерацию рандомных ссылок на элементы коллекции объекта. Когда практически в каждой книжке при работе с элементами коллекции рекомендуется по возможности заменять конструкцию for (var i;i<100;i++) на for (elem in object) //для каждого элемента в объекте Посмотрите оптимизацию циклов работы с объектами, можно не только javascript, но и С++, С#,Delphi, VB?, *.Net, Java Прекращайте свои сумасшедшие предположения, а то можно подумать, что на этом форуме только флудом и тролем занимаются. Столько умных: работают с галереями, документами большого объема, текстом используют различного рода обертки,но по прежнему используют конкатенацию строк заместо document.write("a_1","a_2","a_n",...a_200) Не знают, что при добавление или перемещение визуальных объектов(причем каждого), происходит обновление все документа. window.offscreenBuffering Если этот режим включен, то отображение объектов производится в фоновом режиме, а затем сформированное изображение появляется на экране. offscreenBuffering = true; // включить насильственную буферизацию так же разницу и особенности при работе с [] и {} Аргументы нужно подкреплять, хотя с аргументами от сороки на хвосте куда уж вам.. |
Цитата:
Ты видно ещё не нашёл свои грабли. |
Цитата:
То, что авторы практически каждой книги не читали стандарт, не делает их специалистами, а книжки хорошими. Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Вы когда на другие языки ссылаетесь, учитывайте особенности текущего, что ли. |
Ну во первых, давайте не будем смешивать понятия [] и {}
это не одно и тоже. В массивах нет различия в записи индекса. var arr=[]; arr['1'] = "Первый"; arr['5'] = "Второй"; arr['10'] = "Третий"; alert([arr]) и var arr=[]; arr[1] = "Первый"; arr[5] = "Второй"; arr[10] = "Третий"; alert([arr]) Во вторых конструкция for, это все лишь более удобная форма записи циклов. for(var j=0,s="";j<5;j++){s += j + " "}; alert(s); и опа парсится в /**for (;;) аргументы: 1-ый - инициализация переменных 2-ой - условие выхода из цикла 3-ий - изменение счетчика */ var s="",j = 0; //1-ый - инициализация переменных for (;;){ if (j < 5){ //2-ой - условие выхода из цикла s += j + " "; j++;} //3-ий - изменение счетчика else {break;} } alert(s); Цитата:
Цитата:
for-in - передача по ссылке на объект т.е. Obj[i], а не создание копии с теми же свойствами. Термины живут еще с Assembler-ов. К тому же структуру алгоритмов можно посмотреть, в материалах по дизассемблированию и отладке кода. Так же можно не мало взять с сайтов подобных http://140byt.es/ |
UDN, убейся уже. Хватить херню постить.
|
Цитата:
Цитата:
var a = {}; a[1] = 5; alert(a['1']); // Внезапно!Более того, я не понимаю, как вообще связано то, о чём Вы вещаете, с порядком перебора ключей. |
Цитата:
|
Цитата:
http://alljs.ru/articles/array/iteration Цитата:
По теме поста: если важна последовательность, то только массив. Хэш по определению не обеспечивает порядок. |
Часовой пояс GMT +3, время: 19:22. |