当我查看一个unique()函数时,我发现它接受一个数组作为参数,并返回一个新的数组,其中包含这个数组的唯一元素(这意味着没有重复的项)。不过,我不明白这个功能的逻辑。有人能给我解释一下吗?
以下是功能:
function unique ( array ) {
return array.filter(function(a){
return !this[a] ? this[a] = true : false;
}, {});
}我不能真正理解整个代码,特别是!this[a] ? this[a] = true : false;和作为第二个参数传递给filter的新对象({})。
发布于 2017-01-08 16:14:36
让我们从过滤器开始
filter()方法创建一个新数组,其中包含所有通过所提供函数实现的测试的元素。
a是应用筛选器的数组的随机数。全部内容如下:
return !this[a] ? this[a] = true : false;如果this[a]是真的,那么a已经处理了一次,并将其作为其属性之一添加到其中。否则,this[a]是错误的。因此,取其否定结果为true,则应返回当前a。此外,this[a]将被设置为true,然后继续进行下一个a。
下面的片段将帮助您了解filter所做的事情:
var numbers = [1,2,3,4,5];
var filteredNumbers = numbers.filter(function(number){
console.log(number);
return number > 2;
});
console.log(filteredNumbers);
下面的代码片段将向您展示在unique函数中发生了什么:
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]是真的。因此,执行?后的第一部分是赋值
this[1] = true.现在,this用值true获得了它的第一个键,即1。此外,1将从过滤器返回。同样的情况发生在2和3。当我们到达1时,
!this[1] 是假的,因为this[1]是真的。因此,返回false,并且在处理完数组的所有元素之后,将不会将1添加到将返回的数组中。
发布于 2017-01-08 16:13:52
基本上,.filter将通过提供迭代数组的单个值来调用callBack函数。如果callBack返回一个解析为true的值,则该值将被收集,否则该特定值将被忽略。
这里使用了filter的第二个参数。第二个参数将用作上下文(this),同时在内部调用callBack。因此,在您的代码中,传递的对象将以数组的值作为每次迭代的属性进行添加。在连续的迭代中,代码将检查当前值在最初传递的对象中作为property可用。如果可用,则该三元运算符将返回false,否则返回true。
因此,将从filter函数返回唯一的值。
发布于 2017-01-08 16:14:05
只有当函数传递返回Array.filter时,特鲁西才会获取数组的元素。
对于它正在执行的数组中的每个元素
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)因此,它将只返回每个
https://stackoverflow.com/questions/41534713
复制相似问题