2017-02-16 16 views
1

で正規表現を比較し、インデックス。私は二つの配列を持つJavascript配列

validParameters = ["valid", "alsoValid", /this|that/, /\d+(\.)?\d*/];

と使用:

var ok2go = true; 
// For each entered command... 
for (var i = 0; i < commands.length; i++) { 
    // Check to see that it is a valid parameter 
    if (validParameters.indexOf(commands[i]) === -1) { 
     // If not, an invalid command was entered. 
     ok2go = false; 
     break; 
    // If valid, remove from list of valid parameters so as to prevent duplicates. 
    } else { 
     validParameters.splice(validParameters.indexOf(commands[i]), 1); 
    } 
    return ok2go; 
} 

if (ok2go) { 
    // do stuff if all the commands are valid 
} else { 
    alert("Invalid command"); 
} 

は、それは私がそれを望むように動作します

私は私がvalidParametersを変更した場合、このように正規表現を比較する方法がわかりません正規表現にする必要があるそれらの値には当てはまりません。これを解決する方法はありますか?

テストケース:

enteredCommands = ["valid", "this", 1.1, 3]; 
// Expected Result: ok2go = false because 2 digits were entered 

enteredCommands = ["valid", "alsoValid", "x"]; 
// Expected Result: ok2go = false because x was entered 

enteredCommands = ["valid", "alsoValid", 1]; 
// Expected Result: ok2go = true because no invalid commands were found so we can continue on with the rest of the code 
+0

希望の結果を追加してくださいをしたいかもしれません。 –

+1

あなたは何を求めているのか、何を達成したいのか明確ではない – charlietfl

+0

希望の結果は、 'enteredCommands'がすべて' validParameters'に1回だけ存在することを検証することです。それゆえ、 '' enteredCommands'の全てをループしたいのですが、 'validParameters'に存在する場合は' validParameters'から削除してください。 – mariahm24

答えて

2

あなたは与えられたコマンドをフィルタリングして、正規表現が一致した場合には、正規表現の配列からそれを除外することができます。 regex配列の残りの部分と一致しないコミットのみを返します。

function check(array) { 
 
    var regex = [/valid/, /alsoValid/, /this|that/, /\d+(\.)?\d*/]; 
 

 
    return array.filter(function (a) { 
 
     var invalid = true; 
 
     regex = regex.filter(function (r) { 
 
      if (!r.test(a)) { 
 
       return true; 
 
      } 
 
      invalid = false; \t \t \t \t \t 
 
     }); 
 
     invalid && alert('invalid command: ' + a); 
 
     return invalid; 
 
    }); 
 
} 
 

 
console.log(check(["valid", "this", 1.1, 3])); // 2 digits were entered 
 
console.log(check(["valid", "alsoValid", "x"])); // x was entered 
 
console.log(check(["valid", "alsoValid", 1])); // nothing, no invalid commands were found

+0

これは、 'enteredCommands'に' 'x" 'のようなものが含まれている場合には対処しません。この場合、無効なコマンドが入力されたことを警告します。 – mariahm24

+0

いくつかのテストケースを質問に追加し、何が起こるべきかを入力してください。無効なコマンドが入力された場合、実際にこの答えは 'enteredCommands'を事前にチェックします。 –

+0

テストケースを追加しました。目標は 'validParameters'から削除する必要はありません。これは、これが実行される残りの関数が実行される前に構文チェックを行うだけです。 – mariahm24

0

私はあなたが一致する正規表現と一致する文字列のチェックのためのチェックを分割お勧めします。

概念的には、次の(ないテストコード)

var validStringParameters = ["valid", "alsoValid"]; 
var validRegexMatches = [/valid/, /alsoValid/, /this|that/, /\d+(\.)?\d*/]; 

var validCommands = enteredcommands.filter(function(command){ 
if (validStringParameters.indexOf(command) !== -1){ 
return true; 
} 
for (var i = 0; i < validRegexMatches.length; i++){ 
if (command.test(validRegexMatches[i]){ 
return true; 
}) 
return false; 
} 
}) 
関連する問題