2017-10-18 57 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';过滤器函数返回已过滤的数组。