Комбинированное сравнение / оператор" Spaceship " () в 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;
}
}
2 ответов
from: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;
}
}
насколько я знаю, в javascript нет такого оператора, но вы можете использовать математика.sign ():
Math.sign(a - b);
Примечание: Как упоминалось в комментариях, математика.sign () в настоящее время поддерживается не всеми браузерами. Проверка совместимости (MDN).