2012-10-28 12 views
6

私は2つの配列を持っているとしましょう:1つは正規表現で、もう1つは入力です。それでは、出力と読みやすさの面で、出力のようなものをするのに最適な方法は何ですか?どのように配列の要素を正規表現でjavascriptで配列にフィルタリングできますか?

var regex = [ 
    '/rat/', 
    '/cat/' 
    '/dog/', 
    '/[1-9]/' 
] 

var texts = [ 
    'the dog is hiding', 
    'cat', 
    'human', 
    '1' 
] 

最終結果は私が考えていたことreduceような何かをした、

まあ
result = [ 
    'human' 
] 

です:

// loop by text 
for (var i = texts.length - 1; i >= 0; i--) { 
    // loop by regex 
    texts[i] = regex.reduce(function (previousValue, currentValue) { 
     var filterbyRegex = new RegExp("\\b" + currentValue + "\\b", "g"); 
     if (previousValue.toLowerCase().match(filterbyRegex)) { 
      delete texts[i]; 
     }; 
     return previousValue; 
    }, texts[i]); 
} 

しかし、読めないということでしょうか?多分私は考えていない別の方法があります。

+1

これをhttp://stackoverflow.com/questions/13107048/javascript-desconstrutioning-menuでご覧ください。 –

+1

@IamAndyこの質問は、この質問とどのように遠隔で関連していますか? – Alnitak

答えて

7

私はおそらくこの

var regexs = [ 
    /rat/i, 
    /cat/i, 
    /dog/i, 
    /[1-9]/i 
] 

var texts = [ 
    'the dog is hiding', 
    'cat', 
    'human', 
    '1' 
] 

var goodStuff = texts.filter(function (text) { 
    return !regexs.some(function (regex) { 
     return regex.test(text); 
    }); 
}); 

ようなものになるだろう。しかし、現実的に、パフォーマンスの違いはとても無視できますあなたがいなければここにそれを10,000回行う。

これは簡単にshimmableあるES5方法を、使用していることに注意してくださいは、新しい正規表現に正規表現の配列を組み合わせて、新しい文字列に二番目の配列を組み合わせて、

+0

'.some'をうまく使う - 私はそれを忘れていました。 – Alnitak

+0

おかげで、ほとんどの配列機能はあまり一般的でない既存の方法やそれらのより深い使い方で見つけることができます。彼らは非常に強力です。 ECMAの男の子に –

+0

の小道具を公平に使うために、それらのメソッドのほとんどは、リストを操作する関数が言語にとって中心的な関数型プログラミング言語からはめ込まれていました。 – Alnitak

1

明らかに、テキスト配列elemntは要素で処理する必要があります。しかし、あなたはあなたの正規表現を一つに結合することができます。

あなたが表示する正規表現配列は実際には単純な文字列です。私は先頭と末尾の/文字を削除し、単一の正規表現を構築します。ような何か:

function reduce (texts, re) { 
    re = new RegExp (re.join ('|')); 
    for (var r = [], t = texts.length; t--;) 
    !re.test (texts[t]) && r.unshift (texts[t]); 
    return r; 
} 

alert (reduce (['the dog is hiding', 'cat', 'human', '1'], ['rat', 'cat', 'dog', '[1-9]'])) 

があなたの再文字列が含まれている場合、正規表現の特殊文字が好きなことに注意してください{[^ $など、あなたがいずれかの文字列でそれらをエスケープするか、関数内でそれらを処理する必要があります。

はjsfiddleを参照してください:http://jsfiddle.net/jstoolsmith/D3uzW/

+0

この回答は、大文字と小文字を区別しないか、単語の境界を探すことにも失敗します。 – Alnitak

2

は、ここに私のソリューションです:

var words = [ 'rat', 'cat', 'dog', '[1-9]' ]; 

var texts = [ ... ]; 

// normalise (and compile) the regexps just once 
var regex = words.map(function(w) { 
    return new RegExp('\\b' + w + '\\b', 'i'); 
}); 

// nested .filter calls, removes any word that is 
// found in the regex list 
texts = texts.filter(function(t) { 
    return regex.filter(function(re) { 
     return re.test(t); 
    }).length === 0; 
}); 

http://jsfiddle.net/SPAKK/

0

ジャストアイデア(私が知っている単語を作りました)すべての値は@、#のようなシグナルで分割され、regexを使ってマッチ部分を置き換えます。

関連する問題