如何获得两个集合的交集,同时不仅通过引用而且还通过它们的相同结构和条目识别相等的集合值/项目?

2024-03-13

我有两个交易两个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(使用前将#替换为@)

如何获得两个集合的交集,同时不仅通过引用而且还通过它们的相同结构和条目识别相等的集合值/项目? 的相关文章

随机推荐