В компютърните науки за сортиране на колекция обикновено използваме трипосочен компаратор.

Тристранният компаратор приема два аргумента (напр. a,b) и връща един от тези отговори:

  • Положително число, ако a има по-висок ред в сравнение с b
  • Отрицателно число, ако b има по-висок ред в сравнение с a.
  • 0, ако и двете имат еднакви поръчки.

Повечето разработчици често използват тази концепция в програмирането. Но каква е опасността от частичното прилагане на компаратора?

Обичайна реализация за boolean е използването на inline if като този фрагмент:

anArray.sort((a,b) => a.active ? 1 : -1)

Еха! такъв кратък код! Но какво не е наред с това?

Да, нулата! Без връщане на 0, дори в случай на равенство, редът на масива ще се промени.

Някои гласове казват, на кого му пука?! ̶s̶t̶i̶l̶l̶ ̶t̶h̶e̶ ̶r̶e̶s̶u̶l̶t̶ ̶i̶s̶ ̶a̶c̶c̶e̶p̶t̶a̶b̶l̶e̶ ̶a̶n̶d̶ ̶i̶t̶ ̶w̶i̶l̶l̶ ̶n̶o̶t̶ ̶c̶h̶a̶n̶g̶e̶ ̶i̶f̶ ̶I̶ ̶e̶x̶e̶c̶u̶t̶e̶ ̶i̶t̶ ̶m̶a̶n̶y̶ ̶t̶i̶m̶e̶s̶!

Не! Резултатите не са еднакви в различни среди. Как е възможно?

  • За подобряване на производителността някои от алгоритмите за сортиране (т.е. „сортиране чрез сливане“) разделят масив на по-малки масиви и изпълняват сортирането паралелно на различни процесорни ядра. След това, въз основа на мощността на хардуера и броя на срезовете, резултатите ще се различават.
  • Освен това, ако редът на преместване се промени, резултатът ще се различава. (сортиране от началото до края или от края до началото)
    За решаването на този проблем е силно препоръчително да внедрите инструмента за проверка на равенството в компаратора.
anArray.sort((a, b) => {
    if (a.active == b.active) {
        return 0;
    } else {
        return a.active ? 1 : -1
    }
})

Тези още два реда ще спасят живот! Особено ако е JavaScript и ще работи на различни браузъри и операционни системи.