В Ruby есть оператор под названием "Комбинированное сравнение" или "Космический корабль", он выглядит следующим образом: <=>
Это делает следующее:
a <=> b :=
if a < b then return -1
if a = b then return 0
if a > b then return 1
Есть ли подобный оператор в Javascript? Если нет, как я могу получить такой же результат?
@madox2 предложил использовать Math.sign(a - b)
, который работает для чисел, но не для массивов (для сравнения массивов вам нужно использовать array.length
).
Он также не работает в Internet Explorer, Safari или во всех мобильных браузерах (см. MDN).
@duques_l нашел функцию здесь. Это работает очень хорошо, вы можете проверить это на JSFiddle
Единственная проблема в том, что если строки не сравнимы, функция возвращает -1
вместо nil
Обновление: @duques_l немного изменил функцию, и теперь она работает нормально (я так думаю, вот JSFiddle):
function spaceship(val1, val2) {
if ((val1 === null || val2 === null) || (typeof val1 != typeof val2)) {
return null;
}
if (typeof val1 === 'string') {
return (val1).localeCompare(val2);
}
else {
if (val1 > val2) { return 1 }
else if (val1 < val2) { return -1 }
return 0;
}
}