我正在努力使用以下代码来过滤带有重复项目的数组但保留非重复项目。
temp = temp.filter((a, _, aa) => aa.indexOf(a) === aa.lastIndexOf(a));
我在文档中看到的是Array.prototype.filter
采用带有元素,索引和数组的回调函数。
我不理解的是正在传递的论据:(a, _, aa)
。 _
是用作占位符还是代表其他内容?
答案 0 :(得分:6)
参数列表中的下划线仅作为占位符传递。它通常被用来表示一个被抛弃但从未使用但需要作为占位符出现的论点。本质上是一个"虚拟"变量。 1
在这种情况下,Array.prototype.filter
接受带有三个参数的回调。由于代码的作者想要访问正在调用filter
但不关心索引的数组,因此他们必须提供第二个参数来使用第三个数组参数。请注意,_
就像任何其他变量一样,您仍然可以使用它对变量执行任何操作。它通常被用作一次性变量。
如果您想要解释代码,它只是遍历数组并检查当前元素的索引。如果a
(正在处理的当前元素)aa
中的索引(正在调用数组filter
)是元素出现的最后一个索引,则回调返回true。如果是,那意味着元素在数组中的其他地方出现,从而过滤掉重复的元素。
通常使用"我的意思是许多语言采用这种做法。在Python等语言中,它是一个众所周知的标准。其他语言(如SQL,Haskell和Scala)使用此方法(尽管Haskell是一种模式)。
答案 1 :(得分:2)
就像你说的那样
我在文档中看到的是Array.prototype.filter采用带有元素,索引和数组的回调函数。
因此回调函数a
是正在评估的当前元素,_
将表示a
的当前索引,而aa
是当前正在过滤的数组,在这种情况下temp
根据@Andrew Li的评论编辑:
_
只是一个占位符。它没有在回调中使用,所以为了简单起见,使用_
以便回调可以访问aa
,这将被使用。
答案 2 :(得分:2)
这个论点最好写成(element, index, array) => . . .
是的。永远不会使用_
(或index
)。它只是一个占位符,因此我们可以访问aa
(或array
)参数。
对于任何想要理解该功能有效的人:
如果您不熟悉Array.prototype.filter
,请查看MDN文档:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
此代码仅保留从不重复的元素(仅3
和6
保留在以下代码段中,因为每个元素中只有一个)。发生这种情况的原因是,例如,如果element = 5
然后array.indexOf(element) === 8
(基本array.firstIndexOf(element)
),那么array.lastIndexOf(element) === 10
因为8 !== 10
元素(在这种情况下, 5
)完全被排除在外。
var temp = [1, 1, 1, 2, 2, 3, 4, 4, 5, 5, 5, 6, 7, 7];
temp = temp.filter((element, index, array) => array.indexOf(element) === array.lastIndexOf(element));
console.log(temp);
但是,如果您执行以下操作,则会过滤掉任何重复项,每个元素只会出现一次,因为在某些时候index
将与lastIndex
相同,这意味着该元素将保持。
var temp = [1, 1, 1, 2, 2, 3, 4, 4, 5, 5, 5, 6, 7, 7];
temp = temp.filter((element, index, array) => index === array.lastIndexOf(element));
console.log(temp);