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
。例外情况是,当您声明一个var
var a=1时,将返回未定义。