2017-08-05 5 views
2

これは私がこの質問に対する答えとして見つけたコードです:配列から重複した項目を削除するJavaScriptプログラムを書く(大文字小文字の区別を無視する)。JavaScriptでfilter()でindexOfを使用する方法

var arr1=[3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3, 'A']; 

var uniqueArray = arr1.filter(function(elem,i,rep){ 
    return i == rep.indexOf(elem); 
}) 
console.log(uniqueArray); 

は私が行い、そのindexOfの要素の最初の出現のインデックスを検索するために使用されるものフィルタ()知っているが、このラインは、どのように私は理解していない:

i == rep.indexOf(elem); 

のみ紹介しますuniqueArrayのユニークな要素

+0

'var uniqueArray = [... new Set(arr1)]; ' – baao

答えて

0

戻り値は、見つかった要素のインデックスと等しいことをテストしているため、関数の戻り値はtrueまたはfalseになります。 Array#indexOf約MDNの記事によれば

2

のindexOf()メソッドは、与えられた要素 がアレイの中、または可能な-1が存在しない場合は、最初のインデックスを返します。コードで

あなたが提示してきた:

var uniqueArray = arr1.filter(function(elem,i,rep){ 
    return i == rep.indexOf(elem); 
}) 

をフィルタのコールバック内の変数iは、配列内の現在のアイテムのインデックスです。アイテムの外観が複数ある場合は、現在のインデックス(i)、およびArray#indexOfによって返されたインデックスは、1番目以降の重複値では異なります。この場合、フィルターコールバックはfalseを返し、重複した値は除外されます。

2
i == rep.indexOf(elem); 

は常に素子が配列中に見出された下に最初のインデックスが返され、そうのみすべてのコピーの最初の濾過のアレイに受け入れられます。ここで

+0

私はあなたの行動を説明する方法が好きです。簡潔に説明してください。 – davidxxx

0
var uniqueArray = arr1.filter(function(elem,i,rep){ 
    return i == rep.indexOf(elem); 
}) 

ELEMは、配列の各要素を含むであろう、私は現在のELEMの指標と担当者は現在rep.indexOf(ELEM)全アレイ
を含むことになるであろう。
は常に要素の最初のオカレンスのインデックスを返しますArray.prototype.filter()は、trueを返すとフィルタリングしませんが、falseを返すとすべての要素をフィルタリングします最初の発生は、あなたの例から.filter方法において

array.filter(関数(currentValueは、インデックス、ARR)、thisValue)

w3schoolsから関数を

0

を濾過します除きます各インデックスを繰り返し、を使用していますあなたが言ったように見つける: "最初の発生のインデックス。

繰り返し処理中に、インデックスiが繰り返し要素にまたがり、このiが指定された配列の現在の要素のインデックスと等しいかどうかを確認するためにテストを使用します。w3schoolsから

フィルタ()メソッドは、(関数として提供される)テストに合格し、すべての配列要素が充填された配列を作成します。

例のテストはi == rep.indexOf(elem);です。

繰り返しがインデックス2に達すると、要素はaになります。しかし、要素aが最初に出現するのは、インデックス1です。この時点で、i=2が、rep.indexOf(elem) = 1です。 2==1falseであるため、このテストではfalseが返されます。

このfalseリターンは、新しく作成された配列からインデックス2の反復要素aを除外します。

関連する問題