我有两个交易两个Set
实例。
const set1 = new Set([
{ name: 'a' },
{ name: 'b', lastname: 'bb' },
{ name: 'c' },
{ name: 'd' },
]);
const set2 = new Set([
{ name: 'b' },
{ name: 'd' },
]);
集合中的任何对象都将具有多个且不同的键和值。目标是在两个集合中找到结构上相等的对象(相同的键和值),即...中/的相等数据项的交集set1
and set2
.
在下面的示例中,预期结果是[ { name: 'd' } ]
...
console.log([...set1].filter(item => set2.has(item)));
...但它记录了一个空数组/[]
反而。
一个对象有超过 20 个键,因此必须对它们进行一一比较,而这不能通过硬编码方式完成。
如何实现一种通用方法来计算两个结构相同的数据项列表的交集?
你可以这样做:
const set1 = new Set([
{name: 'a'},
{name: 'b', lastname: 'bb'},
{name: 'c'},
{name: 'd'}
]);
const set2 = new Set([
{name: 'b'},
{name: 'd'}
]);
set1.forEach((value) => {
if (![...set2].some((o) => Object.entries(o).every(([k, v], _, arr) => (Object.keys(value).length === arr.length && value[k] === v)))) {
set1.delete(value);
}
})
console.log([...set1]);
它的作用是迭代set1
如果当前迭代中的项目与中的任何项目不同set2
(![...set2].some(..)
),已删除。
如果这些项目具有相同数量的键并且同一键上的值严格相等,则这些项目被视为相同。
仅当集合中对象的值是基元时,这才有效,如果不是,则必须更改value[k] === v
进行适当的比较。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)