0

値が約 4 つの値のいずれかに一致する場合に true を返す JavaScript 関数を作成しました (以下の例では 3 つだけ)。問題は、値が 2 つしかない場合、関数は正しく機能しますが、3 つ目の値を追加するとコードが壊れることです。

私はjavascriptを初めて使用しますが、これを行うにはもっと良い方法があると思いますか? 検索してみましたが、まだ何も見つかりませんでした。

どんな助けでも大歓迎です。

function isValid(elem, helperMsg){

                var sn6 = /[sS][nN]6/;
                var sn5 = /[sS][nN]5/;
                var sn38 = /[sS][nN]38/;

                if(elem.value.match(sn6 || sn5 || sn38)){
                        //do stuff
                        return true;
                }else{

                        return false;
                }
            }

編集:

配列を使用した2回目の試みは次のとおりです。

    function isLocal(elem, helperMsg){
        var validPostcodes=new Array();
            validPostcodes[0]= /[wW][rR]12/;       
            validPostcodes[1]= /[cC][vV]35/;
            validPostcodes[2]= /[sS][nN]99/;
            validPostcodes[3]= /[sS][nN]6/;
            validPostcodes[4]= /[sS][nN]5/;
            validPostcodes[5]= /[sS][nN]38/;
            validPostcodes[6]= /[oO][xX]29/;
            validPostcodes[7]= /[oO][xX]28/;

        var i = 0;

        for (i = 0; i < validPostcodes.length; ++i) {
            if(elem.value.match(validPostcodes[i])){
                    // do stuff
                    return true;
            }else{
                    alert(helperMsg);
                    elem.focus();
                    return false;
            }
        }
    }
4

1 に答える 1

4
a || b || c

ブール値に評価される式です。つまり、 または のいずれかを実行していmatch(true)ますmatch(false)。次のように記述する必要があります。

match(a) || match(b) || match(c)

別のオプションは、それらを配列に格納してループすることです。つまり、パターンの数が増えても、パターンのリスト以外のコードを変更する必要はありません。別のアプローチは、この状況に限定されますが、パターンを3つのオプションを一緒に論理和することと同等のものに変更することです(テストされておらず、私は正規表現に少し慣れていません):

elem.value.match(/[sSnN][6|5|38]/)

配列ベースの例:

var patterns = [/../, /.../];
for (var i = 0; i < patterns.length; ++i) {
    if (elem.value.match(patterns[i])) { return true; }
}

実際のコードでは、おそらく次のようにフォーマットします。

function isValid(elem, helperMsg){
    var patterns = [/../, /.../],
        i = 0;
    for (i = 0; i < patterns.length; ++i) {
        if (elem.value.match(patterns[i])) {
            return true;
        }
    }
}

JavaScript は変数をそのスコープの一番上に持ち上げるので、これはただの習慣です。そのように変数を宣言する必要は決してありません。

于 2012-05-14T08:17:06.160 に答える