55

次のように、変数が値の範囲と等しいかどうかを判断する簡単な方法はありますか?

if x === 5 || 6 

次のような鈍いものではなく:

if x === 5 || x === 6

?

4

8 に答える 8

85

配列内に値をスタッシュし、次を使用して変数が配列内に存在するかどうかを確認できます[].indexOf

if([5, 6].indexOf(x) > -1) {
  // ...
}

が返された場合-1、変数は配列に存在しません。

于 2012-08-24T20:40:58.390 に答える
24

実行しているテストの種類によって異なります。静的な文字列がある場合、これは正規表現を使用して非常に簡単に確認できます。

if (/^[56ab]$/.test(item)) {
//-or-
if (/^(foo|bar|baz|fizz|buzz)$/.test(item)) {
    doStuff();
} else {
    doOtherStuff();
}

値のセットが小さい場合 (文字列または数値)、次を使用できますswitch

switch (item) {
case 1:
case 2:
case 3:
    doStuff();
    break;
default:
    doOtherStuff();
    break;
}

値のリストが長い場合は、おそらく配列を~arr.indexOf(item)、 またはとともに使用する必要がありarr.contains(item)ます。

vals = [1,3,18,3902,...];
if (~vals.indexOf(item)) {
    doStuff();
} else {
    doOtherStuff();
}

残念ながらArray.prototype.indexOf、一部のブラウザではサポートされていません。幸いなことに、ポリフィルが利用可能です。ポリフィルの問題が発生している場合はArray.prototype.indexOf、 を追加することもできArray.prototype.containsます。

データを関連付ける方法に応じて、オブジェクト内に文字列の動的リストを他の関連情報へのマップとして格納できます。

var map = {
    foo: bar,
    fizz: buzz
}
if (item in map) {
//-or-
if (map.hasOwnProperty(item)) {
    doStuff(map[item]);
} else {
    doOtherStuff();
}

inはプロトタイプ チェーン全体をObject.prototype.hasOwnPropertyチェックしますが、 はオブジェクトのみをチェックするため、これらは異なることに注意してください。

于 2012-08-24T20:46:09.180 に答える
16

全然大丈夫です。値のリストが長い場合は、代わりに次を使用できます。

if ([5,6,7,8].indexOf(x) > -1) {
}
于 2012-08-24T20:41:11.573 に答える
7

はい。独自の関数を使用できます。この例では次を使用します.some

var foo = [ 5, 6 ].some(function(val) {
     return val === x;
   });

foo; // true
于 2012-08-24T20:41:27.990 に答える
3

これは私が使用することに決めたものです:

Object.prototype.isin = function() {
    for(var i = arguments.length; i--;) {
        var a = arguments[i];
        if(a.constructor === Array) {
            for(var j = a.length; j--;)
                if(a[j] == this) return true;
        }
        else if(a == this) return true;
    }
    return false;
}

次のように使用します。

var fav   = 'pear',
    fruit = ['apple', 'banana', 'orange', 'pear'],
    plu   = [4152, 4231, 3030, 4409];

if (fav.isin(fruit, plu, 'eggs', 'cheese')) {
    //do something cool
}

利点は次のとおりです。

  • IE < 9 で動作します。
  • 左から右に自然に読みます。
  • 配列または個別の値をフィードできます。

型強制を許可したくない (許可indexOfしない) 場合は、2 つ==をに変更し===ます。現状:

fav = "4231";
plu.indexOf(fav) //-1
fav.isin(plu)    //true
于 2013-02-28T01:18:58.667 に答える
2

いいえ、ケース固有のトリックがいくつかあるかもしれませんが、一般的に私は次のようなコードを書きます:

if (someVariable === 1 ||
    someVariable === 2 ||
    someVariable === 7 ||
    someVariable === 12 ||
    someVariable === 14 ||
    someVariable === 19) {

    doStuff();
    moreStuff();

} else {
    differentStuff();
}
于 2012-08-24T21:02:44.937 に答える
0

簡単な答えはノーです。多数の文字列値を比較する場合は、switch ステートメントを使用すると読みやすくなりますが、2 つの値に対して使用すると見栄えがよくなりません。

于 2012-08-24T20:43:04.500 に答える
-3

[編集] これは機能しているように見えますが、Dan が指摘したように、実際には誤検知です。この方法は使用しないでください。教育目的のためにここに残します。

私が知っている最も簡単な方法:

a = [1,2,3,4,5];

if(3 in a) alert("true"); // will alert true

Chrome コンソールでテスト済み。他のブラウザで動作するかどうかは不明です。

于 2014-11-05T13:07:31.917 に答える