【发布时间】:2018-09-24 00:08:13
【问题描述】:
如何在对象中使用 Set()?我阅读了文档,它适用于数组中的值,但不适用于对象。为什么?我想避免具有完全相同值的重复项。
let nameList_one = [{ name: 'harry', id: 1 }, { name: 'john', id: 2 }, { 'name': 'trevor', id: 3 }]
let nameList_two = [{ name: 'harry', id: 1 }, { name: 'ron', id: 4 }, { name: 'jackson', id: 5 }]
let fullNameList = [...nameList_one , ...nameList_two ]
let filteredList = [...new Set(fullNameList)] // the output is the merge of two array, duplicating "harry".
输出:
[{ name: 'harry', id: 1 }, { name: 'john', id: 2 }, { 'name': 'trevor', id: 3 }, { name: 'harry', id : 1 }, { name: 'ron', id: 4 }, { name: 'jackson', id: 5 }]
预期输出:
[{ name: 'harry', id: 1 }, { name: 'john', id: 2 }, { 'name': 'trevor', id: 3 }, { name: 'ron', id : 4 }, { name: 'jackson', id: 5 }]
谢谢!!
【问题讨论】:
-
两个不同的对象永远不会是
===。对象比较只涉及对象的引用值;属性值无关紧要。 -
您可能需要对函数 Set() 进行原型设计或向您的对象类型添加自定义比较方法,因为 @Pointy 表示对象比较是通过引用完成的,这将不相等。
-
相关信息:How to customize object equality for Javascript Set - 剧透:“你不能”所以你不能真正使用 Set 来做你想做的事。它根本无法满足您的需求,也无法定制。
-
你可以使用
reduce,类似fullNameList.reduce((a, c) => { !a.find(v => v.id === c.id) && a.push(c); return a; }, []); -
您需要确定是什么使两个对象相同,并将其用于
find函数中的比较。我认为这是id属性。
标签: javascript arrays ecmascript-6