[ID CC-CC2021] Сортировка объектов. Поразительный Adobe

Статус
Закрыто для дальнейших ответов.

vbatushev

Топикстартер
20 лет на форуме
Сообщения
2 242
Реакции
1 227
Нет, возможно, это я такой поразительный.
Но убивался тут над сортировкой. Ничего такого, сортировка и сортировка — массив из объектов, где одним свойств является page с численным значением. Казалось бы:
array.sort(function(a, b) { return a.page - b.page; }
Но нет. Данная сортировка передвигала элементы массива даже, если значения page были равны. Например:
snip_20160408195843.png

В консоли видим:
snip_20160408195856.png

Petr с Semen-ом поменялись местами. Метнулся я к другой консоли — хромовской:
snip_20160408195901.png

Тут-то все хорошо. Это что же получается, такая [...] очередная особенность адобов?
 

andrejK

R.I.P.
Сообщения
10 300
Реакции
5 218
пробуй на майкле с джоном.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Но ведь логично же?
Она вроде как по второму параметру доупорядочивает - не?
 

vbatushev

Топикстартер
20 лет на форуме
Сообщения
2 242
Реакции
1 227
Нет, не логично. Упорядочивать должно по тому, что функция возвращает. А тут 0 == -1.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Так он действительно доупорядочивает по неназванному параметру или просто случайно переставляет?
 

vbatushev

Топикстартер
20 лет на форуме
Сообщения
2 242
Реакции
1 227
Мне кажется, что он воспринимает 0 как -1. Потому что если возвращать -1 при равных параметрах, получаем то же самое.
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Спецификация JS не подразумевает устойчивой сортировки

Array.prototype.sort()

Сводка
Метод sort() на месте сортирует элементы массива и возвращает отсортированный массив. Сортировка не обязательно устойчива (англ.). Порядок cортировки по умолчанию соответствует порядку кодовых точек Unicode.

так что обе реализации ей соответствуют.
устойчивость легко реализовать, в принципе - делать временный массив с полем index, в которое занести первоначальный порядок, и дополнительно сортировать по нему, если функция сравнения возвращает 0
 

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 216
Интересно посмотреть, какие элементы сравниваются при каждой итерации. Есть же несколько методов сортировки массивов.
Код:
var names = [{name:'Semen', page:10}, {name:'Petr', page:10}, {name:'Artem', page:10}];
names.sort( function (a, b) { $.writeln(a.toSource() + '\n' + b.toSource() + '\n===\n'); return a.name - b.name} );
$.writeln(names.toSource());
Опять же, кто скажет, что в результате сортировки получается неупорядоченный массив, может первый бросить камень в Адоб.
 

andrejK

R.I.P.
Сообщения
10 300
Реакции
5 218

Не по теме:
Олег. ты предлагаешь трудный выбор.

бросить камень либо в Виталия, либо в Адобов.

я брошу в адобов)))

 

vbatushev

Топикстартер
20 лет на форуме
Сообщения
2 242
Реакции
1 227
делать временный массив с полем index, в которое занести первоначальный порядок, и дополнительно сортировать по нему, если функция сравнения возвращает 0
Мне это не подходит, положение объектов в массиве достаточно случайное.

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

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Мне это не подходит, положение объектов в массиве достаточно случайное.

так а что подходит тогда? сохранить старый порядок внутри одной страницы не нужно, так как он случайный. новый упорядоченный по строковым значениям не подходит.
 

KostyaSA

Участник
Сообщения
78
Реакции
17
доброго времени суток .. дело в том, что массив имеет свойство .sort(), но в данном случае внутри массива словарь, а словари не имеют сортировки, поэтому все элементы возвращаются рандомно
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Тю
Подумаешь бином ньютона, завести новое свойство "номер в неупорядоченном массиве"
И сделать в функции сортировки ей второй приоритет после основной
 
  • Спасибо
Реакции: Skvoznyak

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 216

Не по теме:
бросить камень либо в Виталия, либо в Адобов.
Не было такого! Я предлагал бросать камень в Адоб, но определить очередность!


Подумаешь бином ньютона, завести новое свойство "номер в неупорядоченном массиве"
Для практических задач у меня есть типовая функция, которая сортирует объекты по порядку. Там минимум три поля сортировки: страница, позиция по вертикали (выше-ниже), позиция по горизонтали (левее-правее). Для текстовых объектов может добавляться еще и индекс, если родитель одинаков.
 

dumbm1

10 лет на форуме
Сообщения
421
Реакции
196
Мда, браузеры (Chrome, Firefox) сортируют нормально – не трогают порядок, если возвращается 0. Прям хоть свою функцию sort пиши... (летящий камень >>>> Adobe)
 
Статус
Закрыто для дальнейших ответов.