Javascript-форум (https://javascript.ru/forum/)
-   Internet Explorer (https://javascript.ru/forum/css-html-internet-explorer/)
-   -   ie9 начал сам сортировать массивы (https://javascript.ru/forum/css-html-internet-explorer/23191-ie9-nachal-sam-sortirovat-massivy.html)

Polkan 15.11.2011 17:36

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 )?

Aetae 15.11.2011 17:50

1. У вас не массив а хэш.
2. Порядок ключей в хэше не гарантирован и может быть произволен.

Polkan 15.11.2011 17:54

хорошо, пусть Хеш.
Проблема в том, что IE до 9 версии его не сортировали, а новый - сортирует. Можно ли это как-то предотвратить?

Polkan 15.11.2011 17:58

Aetae,
т.е. как бы получается, что ваше второе утверждение для новых ie, хром и оперы неверно - порядок непроизволен.

Aetae 15.11.2011 17:58

Цитата:

Сообщение от Polkan (Сообщение 136716)
хорошо, пусть Хеш.
Проблема в том, что IE до 9 версии его не сортировали, а новый - сортирует. Можно ли это как-то предотвратить?

Нельзя. Есщё раз говорю: не зависимо от версии порядок не гарантирован. И в более ранних версиях внезапно могут всплыть несоответствия. Поэтому так делать нельзя. Совем нельзя. Ни в каких версиях никаких браузеров.
Цитата:

Сообщение от Polkan (Сообщение 136720)
Aetae,
т.е. как бы получается, что ваше второе утверждение для новых ie, хром и оперы неверно - порядок непроизволен.

Я не говорил произовлен, я говорил не гарантирован. Т.е. любой какой взбредёт в голову и покажется менее ресурсоёмким разрабам текущего билда.)

Polkan 15.11.2011 18:12

Цитата:

Сообщение от Aetae (Сообщение 136721)
Я не говорил произовлен, я говорил не гарантирован. Т.е. любой какой взбредёт в голову и покажется менее ресурсоёмким разрабам текущего билда.)

Просто дело в том, что этот код я использовал в админке, на которой работает штук 10 сайтов. Некоторые уже около 7 лет. И проблемы с ним до сих пор не было. Т.е. ее невозможно было не заметить.

Если такое использование хэшей категорически неправильное, может быть порекомендуете какие-то рабочие методы?

Aetae 15.11.2011 18:18

Методы зависят от задачи.

Цитата:

И проблемы с ним до сих пор не было
Ничего, зато сейчас... *злобный хохот*

Polkan 15.11.2011 18:21

задача-то простая )
выбирать их хеша
arr['555'] = "Первый";
arr['777'] = "Второй";
arr['666'] = "Третий";
элементы в том порядке, в котором они объявлялись

Pavel M. 15.11.2011 18:23

Цитата:

Сообщение от Polkan
Если такое использование хэшей категорически неправильное, может быть порекомендуете какие-то рабочие методы?

используйте массив
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 + '; ');
    }

Polkan 16.11.2011 12:23

Pavel M.,
спасибо, то что нужно!

UDN 18.11.2011 18:00

Проще записать
var arr = {555:'Первый',777: 'Второй',666: 'Третий'};
	for (var i in arr) {
        alert(i + ':' + arr[i] + '; ');}

Зачем создавать лишении свойства,
объекты используют в коллекции также имена и свойства.

кто муже поведение IE можно включить меньшей версии из тела документа.

B@rmaley.e><e 18.11.2011 19:00

UDN, и наступите на грабли какого-нибудь IE13, который будет, например, вообще каждый раз в случайном порядке выводить.

Уже было сказано, что на какой-либо порядок при переборе for-in рассчитывать не стоит.

UDN 19.11.2011 03:57

Цитата:

Сообщение от B@rmaley.e><e
наступите на грабли какого-нибудь IE13

Вы доживите с начало до IE13 и что за бред со случайным порядком
Какай идиот при создание ПО станет создавать еще и генерацию рандомных ссылок на элементы коллекции объекта.

Когда практически в каждой книжке при работе с элементами коллекции рекомендуется по возможности заменять
конструкцию
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; // включить насильственную буферизацию
так же разницу и особенности при работе с [] и {}
Аргументы нужно подкреплять, хотя с аргументами от сороки на хвосте куда уж вам..

Gozar 19.11.2011 11:27

Цитата:

Сообщение от UDN (Сообщение 137590)
Какай идиот при создание ПО станет создавать

Наверное тот же что в IE9 закругленные углы с градиентной заливкой создал, посмотри "приятно" удивишся :)

Ты видно ещё не нашёл свои грабли.

B@rmaley.e><e 19.11.2011 13:09

Цитата:

Сообщение от UDN
Когда практически в каждой книжке при работе с элементами коллекции рекомендуется по возможности заменять
конструкцию
for (var i;i<100;i++)
на for (elem in object) //для каждого элемента в объекте

Дуглас Крокфорд не так давно заявлял, что видел только одну хорошую книгу по JS. И та — javascript: The Definitive Guide.
То, что авторы практически каждой книги не читали стандарт, не делает их специалистами, а книжки хорошими.

Цитата:

Сообщение от UDN
document.write("a_1","a_2","a_n",...a_200)

Да более того, я даже метод такой не использовал уже лет 5.
Цитата:

Сообщение от UDN
Аргументы нужно подкреплять, хотя с аргументами от сороки на хвосте куда уж вам..

Как два пальца об асфальт: стандарт, п. 12.6.4:
Цитата:

Механизм обхода (перечисления) свойств (шаг 5 первого алгоритма, шаг 6 второго) зависит от конкретной реализации.
Цитата:

Сообщение от UDN
Какай идиот при создание ПО станет создавать еще и генерацию рандомных ссылок на элементы коллекции объекта.

Вы про алгоритмы что-нибудь слышали? Рандомизированные, например.
Цитата:

Сообщение от UDN
Посмотрите оптимизацию циклов работы с объектами, можно не только javascript, но и С++, С#,Delphi, VB?, *.Net, Java

Использовать for-in — офигенная оптимизация. Особенно с учётом того, что все видимые свойства из всей цепочки прототипов будут проитерированы.
Вы когда на другие языки ссылаетесь, учитывайте особенности текущего, что ли.

UDN 19.11.2011 21:00

Ну во первых, давайте не будем смешивать понятия [] и {}
это не одно и тоже.
В массивах нет различия в записи индекса.
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);


Цитата:

Сообщение от B@rmaley.e><e
То, что авторы практически каждой книги не читали стандарт, не делает их специалистами, а книжки хорошими.

Интересные у вас убеждения кроме Дуглас Крокфорд, книги пишут дилетанты))))

Цитата:

Сообщение от B@rmaley.e><e
Использовать for-in — офигенная оптимизация. Особенно с учётом того, что все видимые свойства из всей цепочки прототипов будут проитерированы.

У вас больное воображение, у меня и в мыслях не было так подумать.
for-in - передача по ссылке на объект т.е. Obj[i], а не создание копии с теми же свойствами.
Термины живут еще с Assembler-ов.
К тому же структуру алгоритмов можно посмотреть, в материалах по дизассемблированию и отладке кода.

Так же можно не мало взять с сайтов подобных http://140byt.es/

trikadin 19.11.2011 21:30

UDN, убейся уже. Хватить херню постить.

B@rmaley.e><e 20.11.2011 05:45

Цитата:

Сообщение от UDN
for-in - передача по ссылке на объект т.е. Obj[i], а не создание копии с теми же свойствами.

И? При переборе через for(var i = 0; i < length; ++i), скажу Вам по секрету, копирования тоже не будет. Более того, добиться копирования при работе с объектами в JS весьма сложно.
Цитата:

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

А в объектах они есть?
var a = {};
a[1] = 5;
alert(a['1']); // Внезапно!
Более того, я не понимаю, как вообще связано то, о чём Вы вещаете, с порядком перебора ключей.

Riim 20.11.2011 07:12

Цитата:

Сообщение от UDN
Ну во первых, давайте не будем смешивать понятия [] и {}
это не одно и тоже.

ты не поверишь) В js Массив - это тот же объект, с несколькими геттерами/сеттерами и другим прототипом. Другой прототип не меняет "механику" работы, и парочка геттеров/сеттеров в общем-то тоже.

Kolyaj 21.11.2011 16:10

Цитата:

Сообщение от UDN
Когда практически в каждой книжке при работе с элементами коллекции рекомендуется по возможности заменять
конструкцию
for (var i;i<100;i++)
на for (elem in object) //для каждого элемента в объекте

Это плохие книги, не читайте их.
http://alljs.ru/articles/array/iteration


Цитата:

Сообщение от Riim
Массив - это тот же объект, с несколькими геттерами/сеттерами и другим прототипом.

Если быть точным, то массивах переопределён только внутренний метод [[Set]], который ведёт себя по другому для числовых имён свойств и для length, гетеры все те же.


По теме поста: если важна последовательность, то только массив. Хэш по определению не обеспечивает порядок.


Часовой пояс GMT +3, время: 19:22.