2017-10-18 112 views
0

我剛開始學習java腳本和filter()函數的概念讓我感到困惑。混淆在filter()函數和我需要深入的解釋

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

上面是一個代碼段,其中所述過濾功能示出了沒有重複的陣列,讓我們假設a是與許多重複的數字陣列。

我100%不明白在代碼塊中發生了什麼。我知道過濾函數返回一個布爾值,但item在這個等式中意味着什麼? pos是什麼意思?如果過濾器函數返回一個布爾值,那麼爲什麼這個方程返回一個非重複的數組數組?

+3

您是否閱讀過濾器功能的文檔? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter它解釋了回調函數的參數。 – Barmar

+1

過濾器不返回布爾值,它返回一個已過濾的數組。如果回調函數返回「true」,則item包含在結果中,如果爲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,函數返回0 == 0,即true,因此item包含在結果中。

在第二次迭代中,item = "b"pos = 1a.indexOf(item)返回1,函數返回1 == 1,即true,因此item包含在結果中。

在第三次迭代中,item == "a"pos = 2a.indexOf(item)返回0,函數返回0 == 2,即false,因此item而不是包含在結果中。

在第四次迭代中,item = "c"pos = 3a.indexOf(item)返回3,函數返回3 == 3,即true,因此item包含在結果中。

最終結果是第一次,第二次和第四次迭代中的項目包含在結果中,即["a", "b", "c"]

+0

這是否意味着'pos'對應於數組中的每個元素的索引?所以我們可以說數組是在'[1,2,1,3]',並且我用如上所示的相同函數語法來過濾數組。這是否意味着第一次迭代傳遞的參數將是'function(1,0)'?當迭代再次通過時,它將是'function(2,1)'。 '2'表示元素,'1'表示索引。但是第三次​​迭代不是'function(1,2)'? 我只需要儘可能簡單地分解它。 – Ken

+0

我已經添加了4次迭代的完整示例。 – Barmar

+0

謝謝您的深入解釋!你先生是個學者和紳士! – Ken

0

filter'callback'參數返回'Boolean';過濾器函數返回已過濾的數組。