Комбинированное сравнение/Оператор "Космический корабль" (<=>) в Javascript?
В 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;
}
}
Ответы
Ответ 1
Насколько я знаю, в JavaScript такого оператора нет, но вы можете использовать функцию Math.sign():
Math.sign(a - b);
ПРИМЕЧАНИЕ. Как уже упоминалось в комментариях, Math.sign() в настоящее время поддерживается не всеми браузерами. Проверьте совместимость (MDN).
Ответ 2
от: http://sabrelabs.com/post/48201437312/javascript-spaceship-operator
улучшенная версия:
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;
}
}