filter
不返回布尔值,它返回一个包含原始数组元素的数组。它通过调用您在数组的每个元素上提供的函数来决定包含在结果中的元素。这个函数返回一个布尔值:如果它是真的,那个元素包含在结果中。该函数的参数是元素(在函数中称为item
)及其在阵列中的位置(称为pos
)。
该函数使用indexOf()
来查找数组中第一个元素的位置,该元素与给定元素具有相同的值。如果该位置与给定位置相同,则该元素必须是该数组中第一次出现该值,因此它返回true
,并且该元素将包含在结果中。如果位置不同,则此元素必须稍后重复,因此它返回false
,并且该元素不包含在结果中。最终的结果是,只有每个值的第一个副本包含在过滤结果中,这意味着它们都是唯一的。
例如,假设该阵列是:
["a", "b", "a", "c"]
在第一次迭代,item = "a"
和pos = 0
。 a.indexOf(item)
返回0
,函数返回0 == 0
,即true
,因此item
包含在结果中。
在第二次迭代中,item = "b"
和pos = 1
。 a.indexOf(item)
返回1
,函数返回1 == 1
,即true
,因此item
包含在结果中。
在第三次迭代中,item == "a"
和pos = 2
。 a.indexOf(item)
返回0
,函数返回0 == 2
,即false
,因此item
是而不是包含在结果中。
在第四次迭代中,item = "c"
和pos = 3
。 a.indexOf(item)
返回3
,函数返回3 == 3
,即true
,因此item
包含在结果中。
最终结果是第一次,第二次和第四次迭代中的项目包含在结果中,即["a", "b", "c"]
。
您是否阅读过滤器功能的文档? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter它解释了回调函数的参数。 – Barmar
过滤器不返回布尔值,它返回一个已过滤的数组。如果回调函数返回“true”,则item包含在结果中,如果为false,则不是。在这种情况下,谓词是 - 项目('pos')的当前索引是否与数组中项目的索引相同。如果没有,该项目是重复的,我们会被过滤掉。阅读一下[Array#filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)。 –