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

  • Автор темы Автор темы vbatushev
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

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

Тут-то все хорошо. Это что же получается, такая [...] очередная особенность адобов?
 
пробуй на майкле с джоном.
 
Но ведь логично же?
Она вроде как по второму параметру доупорядочивает - не?
 
Нет, не логично. Упорядочивать должно по тому, что функция возвращает. А тут 0 == -1.
 
Так он действительно доупорядочивает по неназванному параметру или просто случайно переставляет?
 
Мне кажется, что он воспринимает 0 как -1. Потому что если возвращать -1 при равных параметрах, получаем то же самое.
 
Спецификация JS не подразумевает устойчивой сортировки

Array.prototype.sort()

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

так что обе реализации ей соответствуют.
устойчивость легко реализовать, в принципе - делать временный массив с полем index, в которое занести первоначальный порядок, и дополнительно сортировать по нему, если функция сравнения возвращает 0
 
Интересно посмотреть, какие элементы сравниваются при каждой итерации. Есть же несколько методов сортировки массивов.
Код:
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());
Опять же, кто скажет, что в результате сортировки получается неупорядоченный массив, может первый бросить камень в Адоб.
 

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

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

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

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

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

так а что подходит тогда? сохранить старый порядок внутри одной страницы не нужно, так как он случайный. новый упорядоченный по строковым значениям не подходит.
 
доброго времени суток .. дело в том, что массив имеет свойство .sort(), но в данном случае внутри массива словарь, а словари не имеют сортировки, поэтому все элементы возвращаются рандомно
 
Тю
Подумаешь бином ньютона, завести новое свойство "номер в неупорядоченном массиве"
И сделать в функции сортировки ей второй приоритет после основной
 
  • Спасибо
Реакции: Skvoznyak

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


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