首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这个唯一()函数是如何工作的?

这个唯一()函数是如何工作的?
EN

Stack Overflow用户
提问于 2017-01-08 16:07:34
回答 4查看 3.3K关注 0票数 2

当我查看一个unique()函数时,我发现它接受一个数组作为参数,并返回一个新的数组,其中包含这个数组的唯一元素(这意味着没有重复的项)。不过,我不明白这个功能的逻辑。有人能给我解释一下吗?

以下是功能:

代码语言:javascript
运行
复制
function unique ( array ) {
    return array.filter(function(a){
        return !this[a] ? this[a] = true : false;
    }, {});
}

我不能真正理解整个代码,特别是!this[a] ? this[a] = true : false;和作为第二个参数传递给filter的新对象({})。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-01-08 16:14:36

让我们从过滤器开始

filter()方法创建一个新数组,其中包含所有通过所提供函数实现的测试的元素。

a是应用筛选器的数组的随机数。全部内容如下:

代码语言:javascript
运行
复制
return !this[a] ? this[a] = true : false;

如果this[a]是真的,那么a已经处理了一次,并将其作为其属性之一添加到其中。否则,this[a]是错误的。因此,取其否定结果为true,则应返回当前a。此外,this[a]将被设置为true,然后继续进行下一个a

下面的片段将帮助您了解filter所做的事情:

代码语言:javascript
运行
复制
var numbers = [1,2,3,4,5];
var filteredNumbers = numbers.filter(function(number){
    console.log(number);
    return number > 2;
});
console.log(filteredNumbers);

下面的代码片段将向您展示在unique函数中发生了什么:

代码语言:javascript
运行
复制
function unique ( array ) {
  return array.filter(function(a){
    console.log(this);
    return !this[a] ? this[a] = true : false;
  }, {});
}

var array = [1,2,3,1,2,3,4,5,5,6];

console.log(unique(array));

我理解过滤器的基本逻辑,但我不理解作为第二个参数传递的{},以及每个值是如何添加到一个新的数组中的!

第二个参数是一个可选的值,您可以将其传递给filter方法,并且它可以用作执行回调的this (请检查我在开头提到的关于filter的链接)。你在那里传递一个空的物体。当您在回调中使用关键字this时,您将引用此对象。这就是为什么代码第一次在此方法中返回{}的原因。检查第二段输出的第一行。

我将根据第二个片段来解释你问题的第二部分。当您第一次进入时,您有一个空对象(我指的是这个),处理的第一个数字是1,所以这个1是未定义的。所以!this[1]是真的。因此,执行?后的第一部分是赋值

代码语言:javascript
运行
复制
this[1] = true.

现在,this用值true获得了它的第一个键,即1。此外,1将从过滤器返回。同样的情况发生在2和3。当我们到达1时,

代码语言:javascript
运行
复制
!this[1] 

是假的,因为this[1]是真的。因此,返回false,并且在处理完数组的所有元素之后,将不会将1添加到将返回的数组中。

票数 3
EN

Stack Overflow用户

发布于 2017-01-08 16:13:52

基本上,.filter将通过提供迭代数组的单个值来调用callBack函数。如果callBack返回一个解析为true的值,则该值将被收集,否则该特定值将被忽略。

这里使用了filter的第二个参数。第二个参数将用作上下文(this),同时在内部调用callBack。因此,在您的代码中,传递的对象将以数组的值作为每次迭代的属性进行添加。在连续的迭代中,代码将检查当前值在最初传递的对象中作为property可用。如果可用,则该三元运算符将返回false,否则返回true

因此,将从filter函数返回唯一的值。

票数 2
EN

Stack Overflow用户

发布于 2017-01-08 16:14:05

只有当函数传递返回Array.filter时,特鲁西才会获取数组的元素。

对于它正在执行的数组中的每个元素

代码语言:javascript
运行
复制
return !this[a] // if value is not yet on this
  ? this[a] = true  // add value to this and return true (grab element)
  : false;  // value was already cached, so return false (don't grab)

因此,它将只返回每个

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41534713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档