Комбинированное сравнение / оператор" 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).