27

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;
    }
}

4

3 に答える 3

23

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

Math.sign(a - b);

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

于 2016-01-18T10:51:41.387 に答える
8

から: 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;
  }
}
于 2016-01-18T11:36:01.197 に答える
0

現在の js ES2020のワンライナーは次のとおりです。

const spaceship = (a, b) => (a ?? 0).toString().localeCompare((b ?? 0).toString());

すべての文字列比較を返します。

于 2021-10-25T17:29:51.233 に答える