Задать вопрос
@vlados096zver

Будет ли корректно работать сортировка везде?

Допустим есть .sort((a, b) => a.position - b.position). У какого то элемента не будет position. Он вставился на то место где и был. Это будет везде работать или где-то возможна некорректное поведение?
  • Вопрос задан
  • 187 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Академия Эдюсон
    Fullstack-разработчик на JavaScript + ИИ
    11 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Инженер по тестированию + ИИ
    6 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 4
opium
@opium
Просто люблю качественно работать
в современных движках (ES2019+) по спеку работает: NaN из компаратора трактуется как 0, sort стабильный — элементы без position сохранят порядок. но это неявное поведение, а в старых окружениях может быть иначе. лучше явно:
(a.position ?? Infinity) - (b.position ?? Infinity)
Ответ написан

A negative value indicates that a should come before b.
A positive value indicates that a should come after b.
Zero or NaN indicates that a and b are considered equal.



More formally, the comparator is expected to have the following properties, in order to ensure proper sort behavior:

Pure: The comparator does not mutate the objects being compared or any external state. (This is important because there's no guarantee when and how the comparator will be called, so any particular call should not produce visible effects to the outside.)
Stable: The comparator returns the same result with the same pair of input.
Reflexive: compareFn(a, a) === 0.
Anti-symmetric: compareFn(a, b) and compareFn(b, a) must both be 0 or have opposite signs.
Transitive: If compareFn(a, b) and compareFn(b, c) are both positive, zero, or negative, then compareFn(a, c) has the same positivity as the previous two.


Если слева, справа или с обоих сторон position будет undefined, то в результате будет NaN
Ответ написан
Комментировать
Alexandroppolus
@Alexandroppolus
кодир
Если надо элементы без position оставлять на своих местах, то можно собрать все элементы с position в отдельный массив, отсортировать его, потом уже в новом порядке вернуть в исходный массив. Как-то так (не дебажил):

const arrWithPos = arr.filter(x => x.position != null);
arrWithPos.sort((a, b) => a.position - b.position);
let p = 0;
for (let i = 0; i < arr.length; ++i) {
  if (arr[i].position != null) {
    arr[i] = arrWithPos[p];
    p++;
  }
}
Ответ написан
Комментировать
kiruhakiselev
@kiruhakiselev
Frontend developer
Будет некорректное поведение. Кинет ошибку undefined при отсутствии свойства position. Вы всегда можете убедиться сами как работает код, достаточно открыть консоль браузера и его запустить. Пробуйте :)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы