2016-05-25 42 views
15

文字列に配列の要素が含まれているかどうかを確認するにはどうすればよいですか?要素に文字列がある場合、配列をフィルタリングしたい下記のコードをご覧ください。文字列にJavaScriptの配列の要素が含まれていないか確認してください。

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
 

 
function checker(value) { 
 
    var prohibited = ['banana', 'apple']; 
 

 
    for (var i = 0; i < prohibited.length; i++) { 
 
    if (value.indexOf(prohibited[i]) == -1) { 
 
     return true; 
 
    } else { 
 
     return false; 
 
    } 
 
    } 
 
} 
 

 
arr = arr.filter(checker); 
 
console.log(arr);

結果は[ 'apple', 'kiwi', 'orange' ]あります。 'apple'は削除されますが、削除されません。

上記のコードは 'apple'ではなく 'banana'のみにフィルタされています。フィルタリングするキーワードがたくさんあります。簡単な方法がありますか?

答えて

15

問題はforループにあります。これは、戻りが関数を終了してプロセスのforループを切り捨てるため、一度しか反復しません。したがって、forループが完了した後に関数を返すように、コードを更新することができます。

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
 

 
function checker(value) { 
 
    var prohibited = ['banana', 'apple']; 
 

 
    for (var i = 0; i < prohibited.length; i++) { 
 
    if (value.indexOf(prohibited[i]) > -1) { 
 
     return false; 
 
    } 
 
    } 
 
    return true; 
 
} 
 

 
arr = arr.filter(checker); 
 
console.log(arr);


機能を低減するために、あなたは 'すべての' メソッドは、それぞれに一度に提供するコールバック関数を実行every()indexOf()方法

を使用することができます配列に存在する要素コールバックが偽の値(ブール値に変換されたときに偽になる値)を返すコールバックを見つけるまで。そのような要素が見つかると、everyメソッドは直ちにfalseを返します。それ以外の場合、コールバックがすべての要素に対して真の値を返した場合、すべてがtrueを返します。コールバックは、値が割り当てられた配列のインデックスに対してのみ呼び出されます。それが削除されたか、値が割り当てされていなかったどのインデックスに対して呼び出されていません。(Taken from here

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
 

 
function checker(value) { 
 
    var prohibited = ['banana', 'apple']; 
 
    return prohibited.every(function(v) { 
 
    return value.indexOf(v) == -1; 
 
    }); 
 
} 
 

 
arr = arr.filter(checker); 
 
console.log(arr);


古いブラウザcheck polyfill option of every methodについて。


ここでも正規表現を使用できます。配列を使用して正規表現を生成し、正規表現の変換に文字列のために、この答えを参照してください試合に

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
 

 
function checker(value) { 
 
    var prohibited = ['banana', 'apple']; 
 
    var regex = new RegExp(prohibited.map(function(s) { 
 
    return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&') 
 
    }).join('|')); 
 
    return !regex.test(value); 
 
} 
 

 
arr = arr.filter(checker); 
 
console.log(arr);

をチェックするtest()を使用:正規表現を構築することにより、例えばCan you create JavaScript regexes on the fly using string variables?

0
<script> 
$(document).ready(function(){ 
    var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 

    var prohibited = ['banana', 'apple']; 

$.each(arr,function(arr_index,arr_value) 
{ 
    $.each(prohibited,function(p_index,p_value) 
    { 
     if(arr_value == p_value) 
     { 
      alert(arr_value+" = "+p_value); 
     } 
     else 
     { 
      alert(arr_value+" != "+p_value); 
     } 
    }); 
}); 

}); 
</script> 
+1

私はどこでもOPの質問で述べたjQueryのを見ていない、また、いくつかの説明は、「あなたのコードがどのように動作するか、」参考になります。 –

+1

JQueryは言及されていませんが、質問者は簡単に理解できるように簡単な方法を定義することを求めました。私はそれをテストしたので、コードはうまくいきます。 **各**機能は** foreach **と似ていますので、それぞれネストすると問題は解決します –

+0

確かにこれはうまくいくでしょうが、JavaScriptに関する質問にjQueryの回答を提供すべきではありません。 –

0

とそれに対してテストする:

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
var prohibited = ['banana', 'apple']; 

var escapeForRegex = function(str) { 
    return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); 
}; 

var r = new RegExp(prohibited.map(escapeForRegex).join("|")); 
arr.filter(function(v){ return !r.test(v) }); 
11

それはそのような単純なことができます:

const arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 
 

 
const checker = value => 
 
    !['banana', 'apple'].some(element => value.includes(element)); 
 

 
console.log(arr.filter(checker));

のECMAScript 6 FTW!

checkeran arrow functionを使用します。

!は、条件に合致しないすべての要素を除外することを意味します。

アレイの一部の要素が設けられた関数によって実装試験に合格するかどうかをsome()方法試験。 Array.prototype.some() docs on MDM

から

includes()方法は、1つの文字列がtrue又はfalse適宜に戻し、別の文字列の中に見出すことができるか否かを判断します。いくつかの最新のECMAScriptの機能はすべてのブラウザでサポートされていない

String.prototype.includes() docs on MDM


から、あなたは私はこれができるとは思わECMAScriptの5

2

にあなたのコードをコンパイルするBabelを使用する必要があります大幅に簡素化される。これらのことをチェックするためのjavascriptにはすでにビルドされています。考えてみましょう:

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange']; 

function checker(value) { 
    var prohibited = ['banana', 'apple']; 

    // indexOf() returns -1 if the element doesn't exist in the prohibited array 
    return prohibited.indexOf(value) == -1; 
} 

arr = arr.filter(checker); 
console.log(arr); 
関連する問題