【发布时间】:2016-07-25 20:21:47
【问题描述】:
从ES6开始,获取没有重复项的数组的代码变得优雅了:
[...new Set(array)];
就是这样!
但是,这仅在数组具有原始数据类型(字符串、布尔值、数字...)的元素时才删除重复项。
一组对象字面量呢? 使用与上面使用的语法接近的语法,如何在不重复的情况下使其工作?
var array=["aaa","bbb","aaa","cc","aaa","bbb"];
var out=[...new Set(array)];
console.log(out)
//----Literal Object
array=[{n:"J",last:"B"},{n:"J",last:"B"}];
out=[...new Set(array)];
console.log(out)
上面的代码生成了一个包含 2 个元素的集合,但在这种情况下我希望它只有一个。
我可以使用序列化/反序列化方法来实现这一点:
[...new Set(array.map(
//-- SERIALIZE:
(e) => `${e.n}:${e.last}`
))].map(
//-- DE-SERIALIZE:
(e) => ({ n: `${e.split(':')[0]}`, last: `${e.split(':')[1]}` })
)
但是,我正在寻找 ES6 内置。
【问题讨论】:
-
Set也适用于对象。但是,在您的情况下,您有两个不同的对象,即使它们具有相同的属性(和值)。您已经定义了自己的逻辑来比较和过滤此类数组。 -
Set不支持自定义比较器。因此,如果您不想重新发明轮子,则必须使用 Lodash 的uniqueBy -
是的;别人在说什么。
Set不是那样工作的。
标签: arrays functional-programming ecmascript-6 unique