0

JavaScript (および他のほとんどのプログラミング言語) では、同じ変数に対して複数の条件をチェックし、各条件に対して同じアクションを実行する場合、if ステートメントを簡潔に記述するのが難しいことに気付きました。このようなシナリオで if ステートメントをより簡潔に書くことは可能ですか?

if(x==1|x==2|x==3){ //Is there any way to make this less verbose?
    console.log("X equals either 1 or 2 or 3!");
}

//this isn't syntactically correct, but it's more concise,
//and I wish it were possible to write it more like this
if(x==(1|2|3)){
    console.log("X equals either 1 or 2 or 3!");
}
4

5 に答える 5

3

正規表現を使用できます。

if (/^(1|2|3)$/.test(x)) { ... }
于 2013-03-29T16:45:21.333 に答える
2

これを使用できます:

if ([1, 2, 3].indexOf(x) >= 0) { ... }

より複雑な等価性テストが必要な場合は、独自の関数を定義し、組み込みのsome()イテレータで使用できます。

function match(value1, value2) { var result = . . .; return result; }

if ([1, 2, 3].some(match.bind(null, x))) { . . . }

( bindJS 1.8.5 で登場しました。下位互換性が必要な場合は、次を使用できます。

if ([1, 2, 3].some(function(elt) {return match(x, elt);})) { . . . }
于 2013-03-29T16:47:51.420 に答える
1

私の経験では、ほとんどの場合、bool を返すメソッドを定義するだけで if ステートメントをより簡潔にすることができます。コードが読みやすくなり、テストが容易になり、この方法でより多くのコードを再利用することさえできます。

もちろん、他の回答も便利です。

要求された一例:

if (password.length < 6 || ! /[0-9]/.test(password) || password == userName) {
    alert('password doesn\'t meet security standards!');
}

対。

function isSecurePassword(pw, userName) {
    if (password.length < 6) return false;
    if (/[0-9]/.test(password)) return false;
    if (password == userName) return false;

    return true;
}

if ( ! isSecurePassword(pw, userName)) {
    alert(..);
}

(通常、オブジェクトとメソッドがあり、変数を渡す必要はありません)

于 2013-03-29T16:58:28.937 に答える
1

ええ、同じ値を使用する複数の if ステートメントの省略形についてよく疑問に思います。

自由な時間があれば、JS の関数型プログラミング構造をいくつか調べてみることをお勧めします。より洗練されたソリューションを実現できる可能性があります。

私は頭のてっぺんから良いまたはステートメントを思いつくことができませんでしたが、「AND」は簡単なように思えます.

var Cond = {
    'and': function(val, predicates) {
        return predicates.every( function(predicate) { return predicate(val) } );
    }
}

var predicates = [
    function(val) { return val > 40; }
    function(val) { return val < 45; }
    function(val) { return val === 42; }
];

console.log( Cond.and( 42, predicates ) );

私の例は非常に不自由ですが、簡単に操作できるはずです。

于 2013-03-29T17:42:58.050 に答える
1

また

if([1, 2, 3].indexOf(x) !== -1){} //since JS 1.6

Array.indexOf

于 2013-03-29T16:49:58.093 に答える