2017-03-25 6 views
1

をJS理解することができません。私はそう期待される出力された配列にこれはコード[アレイとフィルタ]

var array1 = [1, 2, 3]; 
var array2 = [2, 30, 1]; 

を結合して、すべての重複項目を削除

に私たちを尋ねた質問に出くわしました

[1, 2, 3, 30] 

コメント欄にはこの解決策がありましたeは理解する:

var array1 = [1, 2, 3]; 
var array2 = [2, 30, 1]; 
function concatArrays(array1, array2){ 
    var concated = array1.concat(array2); 
    var solution = concated.filter(function(element,Index,self){ 
     return Index== self.indexOf(element); 
    }); 
console.log(solution); 
} 
concatArrays(array1,array2); 

は、だから、私は、フィルタメソッドが何を知っているこのライン

var solution = concated.filter(function(element,Index,self){ 
     return Index == self.indexOf(element); 
    }); 

を理解したいのですが、その後、戻り部分に私は彼のコードを理解することができないんです。
これは私がリターン部分がすると思います。
index of elementindex of current elementを比較してください。それが等しいなら、それ以外の場合は何もしないでください。
私の解釈が正しいかどうかわかりません。

+0

あなたはリターンについてのどの部分を理解していませんか? 2つの指標を比較しています。 – Carcigenicate

+0

EDITED @Carcigenicateその2つのインデックスを比較すると、どのようにして重複値を削除できますか? 例 要素が1の場合、その要素のインデックスと比較した後、indexOf()を使用して0に変換されるので、どのようにして重複データを削除できますか? –

+0

*現在のインデックス*と、配列内のこの要素の最初の出現*のインデックスを比較します。そして、このコードの大文字の 'Index'は臭いがします。それはクラスではありません。 – Thomas

答えて

0

見ての通り、あなたが

            result 
    element  index  indexOf comparison  array 
---------- ---------- ---------- ---------- ---------- 
     1   0   0  true   1 
     2   1   1  true   2 
     3   2   2  true   3 
     2   3   1  false 
     30   4   4  true   30 
     1   5   0  false 

を取得し、項目が結果になります。つまり、実際の要素のインデックスは、Array#indexOfの値と同じでなければなりません。 indexOfは、必要な項目の最初のインデックスまたは見つからない場合は-1を返します。したがって、インデックスと値がindexOfでない場合は、2番目または3番目の値が見つかりますが、最初の値はありません。

function concatArrays(array1, array2) { 
 
    var concated = array1.concat(array2); 
 
    console.log('element', 'Index', 'indexOf', 'comparison'); 
 
    var solution = concated.filter(function (element, Index, self) { 
 
     console.log(element, Index, self.indexOf(element), Index == self.indexOf(element)); 
 
      return Index == self.indexOf(element); 
 
     }); 
 
    console.log(solution); 
 
} 
 

 
var array1 = [1, 2, 3]; 
 
var array2 = [2, 30, 1]; 
 

 
concatArrays(array1, array2);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

Filetr関数は、以前の配列と関数に基づいて新しい配列を作成するのが簡単です。
関数が渡された場合、trueが返されます。

これは、あなたがそれを理解するため、この機能の簡単なimplemenationは次のとおりです。

function Filter(array, func) { 
 
    var newArray = []; 
 
    for (var i = 0; i < array.length; i++) { 
 
    if (func(array[i], i, array)) { 
 
     newArray.push(array[i]); 
 
    } 
 
    } 
 
    return newArray; 
 
} 
 

 
console.log(Filter([1, 1, 1, 2, 3, 4], function(element, index, self){ 
 
    return index == self.indexOf(element); 
 
}))
今、その項目がインデックスで発見された場合、我々は、配列の要素を反復し、それぞれのために私たちがチェックすると

indexOfが最初のインデックスを返すので、重複を追加しないためです。比較がtrueある場合は、フィルタループのすべてのステップのための出力を挿入して、値をチェックすることができ

+0

あなたは 'found'にタイプミスがあります –

関連する問題