我不太明白这个函数中发生了什么。
function unique(array) {
return array.filter(function(a){
return !this[a] ? this[a] = true : false;
}, {});
}
此函数将从数组中删除重复项,我知道“a”参数代表数组中的每个元素,但我有两个问题:
“this”代表“array”吗?如果是这样,如果我有一个数组:
let array = [1,2,3,400,5];
array[400] 是未定义的,所以我的猜测似乎不正确。
末尾的空对象'{}'是什么?
最佳答案
.filter()
函数有一个可选的第二个参数;在这种情况下,该参数是一个空对象 {}
。该值用作每次调用回调函数时 this
的值。 this
的值不是对数组本身的引用。
因此,该代码使用该对象来跟踪到目前为止在数组中看到的值。回调检查键是否尚未添加到对象。如果不是,则添加值 true
,并返回 true
。否则,当键已经在对象中时,回调返回 false
。因此,对于数组中某些重复值的第二次和后续出现,.filter()
函数不会将其包含在结果中。
请注意,只有当数组包含可以“很好地”转换为字符串的内容时,此技术才有效,因为属性名称必须是字符串。一个变体可以使用一个 Set 实例(在 ES2015 环境中)来克服这个限制:
function unique2015(array) {
return array.filter(function(a){
return !this.has(a) ? this.add(a) : false;
}, new Set());
}
编辑 — 使用 ES2015 实际上可以简单得多:
function unique2015(array) {
return Array.from(new Set(array).values());
}
Set 构造函数基本上完成了所有工作。
关于javascript - 我不理解 Javascript 中删除重复项的 filter() 方法。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39173878/