web-dev-qa-db-ja.com

JavaScriptでの比較/「宇宙船」演算子(<=>)の組み合わせ?

RubyにはCombined Comparisonまたは "Spaceship"演算子と呼ばれるものがあります。これは次のようになります:<=>

次のことを行います。

a <=> b :=
    if a < b then return -1
    if a = b then return  0
    if a > b then return  1

クレジット

JavaScriptに同様の演算子はありますか?そうでない場合、どうすれば同じ結果が得られますか?


@ madox2Math.sign(a - b)を使用することをお勧めします。これは配列では機能しません(配列を比較するには、array.lengthを使用する必要があります)。

また、Internet Explorer、Safari、またはすべてのモバイルブラウザーでは機能しません( [〜#〜] mdn [〜#〜] を参照)。


@ duques_lは、関数 こちら を見つけました。それは非常にうまく機能し、 JSFiddle でテストできます

唯一の問題は、文字列が比較できない場合、関数はnilではなく-1を返すことです

更新:@ 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;
    }
}

20
Kaspar Lee

私が知る限り、JavaScriptにはそのような演算子はありませんが、 Math.sign() 関数を使用できます。

Math.sign(a - b);

注:コメントで述べたように、Math.sign()は現在すべてのブラウザでサポートされているわけではありません。互換性を確認してください( [〜# 〜] mdn [〜#〜] )。

14
madox2

から: 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;
  }
}
8
Pierre