javascript - 我不理解 Javascript 中删除重复项的 filter() 方法。

标签 javascript

我不太明白这个函数中发生了什么。

    function unique(array) {
      return array.filter(function(a){
        return !this[a] ? this[a] = true : false;
      }, {});
    }

此函数将从数组中删除重复项,我知道“a”参数代表数组中的每个元素,但我有两个问题:

  1. “this”代表“array”吗?如果是这样,如果我有一个数组:

    let array = [1,2,3,400,5];
    

    array[400] 是未定义的,所以我的猜测似乎不正确。

  2. 末尾的空对象'{}'是什么?

最佳答案

.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/

相关文章:

Javascript 根据 pray_name 获取每个值

javascript - javascript 语句中的 Php 语句

javascript - 火狐插件 : how to debug simple-storage using addon builder

javascript - 比较两个对象不起作用?

javascript - 在 AngularJS 中保留路由更改的滚动位置?

javascript - Jquery 函数在 ASP.NET 用户控件中没有被触发

javascript - 如果出现 HTTP 错误 422,如何使用 fetch 获取响应正文?

javascript - 自动向左对齐图像网格

javascript - 单击时交换输入值的纯 JavaScript 方式

javascript - 当元素的 `class` 属性更改时是否会触发事件?