2017-10-18 8 views
0

私はちょうどJavaスクリプトを学び始めました。filter()関数のコンセプトは私にとって混乱しています。上記filter()関数で混乱していて、私は深い説明が必要です

a.filter(function(item, pos) { 
    return a.indexOf(item) == pos; 
}) 

フィルタ関数はaは多くの重複番号を持つ配列であると仮定することができ、重複せずにアレイを示すコードスニペットです。

私は100%がコードブロック内で何が起こっているのか理解していません。私はフィルタ関数がブール値を返すことを知っていますが、itemはこの式で何を意味しますか? posの意味は?フィルタ関数がbooleanを返すと、なぜこの式は重複しない数値の配列を返しますか?

+3

'filter'関数のドキュメントを読んだことがありますか? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filterここでは、コールバック関数の引数について説明します。 – Barmar

+1

フィルタはブール値を返しません。フィルタ処理された配列を返します。コールバックが 'true'を返す場合、itemは結果に含まれ、falseならfalseになります。この場合、述語は - 項目の現在のインデックス( 'pos')を行い、配列内の項目のインデックスと同じです。そうでない場合、アイテムは重複しており、除外されます。 [Array#filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)について少しお読みください。 –

答えて

1

filterはブール値を返しません。元の配列の要素を含む配列を返します。配列の各要素に指定した関数を呼び出すことによって、結果にどの要素を含めるかを決定します。この関数はブール値を返します。真実であれば、その要素は結果に含まれます。関数への引数は、要素(関数内ではitemと呼ばれます)と配列内の位置(posと呼ばれます)です。

この関数は、indexOf()を使用して、指定された要素と同じ値を持つ配列の最初の要素の位置を検索します。その位置が与えられた位置と同じ場合、この要素は配列内のその値の最初のオカレンスでなければならないので、trueを返し、その要素が結果に含まれます。位置が異なる場合、この要素は後で複製する必要があるため、falseを返し、その要素は結果に含まれません。これの最終的な結果は、各値の最初のコピーだけがフィルタリングの結果に含まれていることです。つまり、すべてが一意です。例えば

、アレイがあると仮定:最初の反復で

["a", "b", "a", "c"] 

item = "a"pos = 0a.indexOf(item)0を返し、関数はtrueである0 == 0を返します。したがって、itemが結果に含まれます。

2回目の反復では、item = "b"pos = 1です。 a.indexOf(item)1を返し、関数はを返します。これはtrueです。したがってitemが結果に含まれます。

3回目の反復では、item == "a"pos = 2です。 a.indexOf(item)0を返し、関数はfalseである0 == 2を返します。したがって、itemではありません。が結果に含まれます。

第4の反復では、item = "c"pos = 3です。 a.indexOf(item)3を返し、関数がtrueである3 == 3を返すため、itemが結果に含まれます。

最後の結果は、1番目、2番目、4番目の反復の項目が結果に含まれていることです。これは["a", "b", "c"]です。

+0

これは、 'pos'が配列の各要素のインデックスとして対応しているのでしょうか?したがって、配列は '[1,2,1,3]'にあり、上に示したものと同じ関数構文で配列をフィルタリングします。引数が渡される最初の反復が 'function(1,0)'になることを意味しますか?繰り返しが繰り返されると 'function(2、1)'になります。要素を示す「2」、インデックスを示す「1」。しかし、3回目の反復は「関数(1,2)」ではないでしょうか? 私はできるだけ単純に分解する必要があります。 – Ken

+0

私は4回の反復の完全な例を追加しました。 – Barmar

+0

詳細な説明をありがとう!あなたは学者と紳士です! – Ken

0

フィルタ 'callback'パラメータは 'ブール値'を返します。 filter関数はフィルターされた配列を返します。

関連する問題