Javascript 这个惟一的()函数是如何工作的
当我查看Javascript 这个惟一的()函数是如何工作的,javascript,arrays,filter,Javascript,Arrays,Filter,当我查看unique()函数时,我发现 它将数组作为参数并返回一个新数组,该数组包含此数组的唯一元素(这意味着没有重复项)。然而,我不能理解这个函数的逻辑。谁能给我解释一下吗 以下是函数: function unique ( array ) { return array.filter(function(a){ return !this[a] ? this[a] = true : false; }, {}); } 我不能真正理解整个代码,尤其是!这个[a]?这[a
unique()
函数时,我发现
它将数组作为参数并返回一个新数组,该数组包含此数组的唯一元素(这意味着没有重复项)。然而,我不能理解这个函数的逻辑。谁能给我解释一下吗
以下是函数:
function unique ( array ) {
return array.filter(function(a){
return !this[a] ? this[a] = true : false;
}, {});
}
我不能真正理解整个代码,尤其是
!这个[a]?这[a]=true:false
和作为第二个参数传递给filter
的新对象({}
)基本上,.filter
将通过提供迭代数组的各个值来调用回调
函数。如果回调
返回的值解析为true
,则将收集该值,否则将忽略该特定值
这里使用了filter
的第二个参数。在内部调用回调时,第二个参数将用作上下文(this
)。因此,在代码中,传递的对象将与数组的值一起添加,作为每次迭代的属性。在连续迭代中,代码将检查当前值是否作为初始传递对象中的属性可用。如果可用,则该三元运算符将返回false
,否则返回true
因此,将从筛选器函数返回唯一值。仅在函数返回时获取数组元素
对于它正在执行的数组的每个元素
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)
因此,它只会返回其中的1个让我们从以下内容开始:
filter()方法使用通过的所有元素创建一个新数组
由提供的函数实现的测试
a
是应用过滤器的数组的随机数。其全部实质体现在以下声明中:
return !this[a] ? this[a] = true : false;
如果this[a]
为true,则a
已被处理一次,并已作为其属性之一添加到此中。否则,此[a]
为false。因此,将其否定结果设为true,并应返回当前的a
。此外,此[a]
将设置为true,然后我们继续下一个a
以下代码片段将帮助您掌握过滤器的功能:
var数=[1,2,3,4,5];
var filteredNumbers=numbers.filter(函数(数字){
控制台日志(编号);
返回次数>2;
});
控制台日志(过滤器编号)代码>其他答案基本上解释了这是如何工作的。但有两点:
首先,而不是返回!这个[a]?这[a]=true:false代码>,写起来会更简洁
!this[a] && (this[a] = true)
其次,该代码有一个缺陷,即它只对可以作为对象键的元素(基本上是字符串或数字)起作用。这就是为什么使用Set
更好的原因:
Array.from(new Set(array))
上述操作适用于任何基本体或对象
第三,这种方法不能正确处理字符串和数字。如果数字1
存在,它将过滤掉字符串“1”
constuniq=a=>a.filter(x=>!this[x]&(this[x]=true),{});
log(uniq([1,'1'])代码>否它是数组中的随机项。@ManosKounelakis请看一看我添加的代码片段,以便看到它的实际作用。我了解筛选器的基本逻辑,但我不了解作为第二个参数传递的{}
,以及如何使用将每个值添加到新数组中!此[a]
否则,此[a]
为假。否,否则,此[a]
未定义。筛选器是否也会将{“1”:true,“2”:true,“3”:true,“4”:true,“5”:true,“6”:true}转换为[1,2,3,4,5,6]?此[a]=true//这是如何添加值并返回true的?当您为变量赋值时,它会返回您正在赋值的值。如果在控制台上键入a=1
,您将看到1
。例外情况是,当您声明一个varvar a=1时,将返回未定义。