我有一个数组,其中包含另一个具有键值对的对象数组。我想根据每个对象中常见的键来合并和分离这些对象数组。可以有 n 个对象数组。
array1 = [
[
{ Time: 45, Element: 'Hi'},
{ Time: 55, Element: 'Hi' },
{ Time: 65, Element: 'Hi' }
],
[
{ Time: 45, Element: 'Hi' },
{ Time: 55, Element: 'Hi' },
{ Time: 65, Element: 'Hi' },
{ Time: 25, Element: 'Hello' },
{ Time: 35, Element: 'Hello' },
{ Time: 20, Element: 'Hello' }
],
[
{ Time: 45, Element: 'Hi' },
{ Time: 55, Element: 'Hi' },
{ Time: 65, Element: 'Hi' },
{ Time: 25, Element: 'Hello' },
{ Time: 35, Element: 'Hello' },
{ Time: 20, Element: 'Hello' },
{ Time:100, Element: 'Bye'}
]
];
我对合并数组的期望如下:
mergedArray = [
[
{ Time: 45, Element: 'Hi'},
{ Time: 55, Element: 'Hi' },
{ Time: 65, Element: 'Hi' }
],
[
{ Time: 25, Element: 'Hello' },
{ Time: 35, Element: 'Hello' },
{ Time: 20, Element: 'Hello' }
],
[
{ Time:100, Element: 'Bye'}
]
];
如何在Javascript中实现这一点?
我尝试了以下代码
arrays = [
[
{ Time: 45, Element: 'Hi'},
{ Time: 55, Element: 'Hi' },
{ Time: 65, Element: 'Hi' }
],
[
{ Time: 45, Element: 'Hi' },
{ Time: 55, Element: 'Hi' },
{ Time: 65, Element: 'Hi' },
{ Time: 25, Element: 'Hello' },
{ Time: 35, Element: 'Hello' },
{ Time: 20, Element: 'Hello' }
],
[
{ Time: 45, Element: 'Hi' },
{ Time: 55, Element: 'Hi' },
{ Time: 65, Element: 'Hi' },
{ Time: 25, Element: 'Hello' },
{ Time: 35, Element: 'Hello' },
{ Time: 20, Element: 'Hello' },
{ Time:100, Element: 'Bye'}
]
];
const uniqueMergedArray = arrays.reduce((result, obj) => {
if (!result.some(item => item.Element === obj.Element)) {
result.push(obj);
}
return result;
}, [])
console.log("Merged Array:", uniqueMergedArray);
上面的代码只返回第一个数组。请建议一种简单的方法来合并对象数组并获得三个不同的、没有重复项的唯一数组。预先感谢。
obj
回调中的.reduce()
代表内部数组之一,而不是对象,因此您没有正确迭代内部数组并检查对象。我建议在内部 .map()
中使用 .filter()
,并在末尾添加一个 filter()
以删除空数组:
const arrays = [ [{Time: 45,Element:'Hi'},{Time: 55, Element: 'Hi' },{ Time: 65, Element: 'Hi' }], [{Time: 45,Element:'Hi' }, { Time: 55, Element: 'Hi'},{Time: 65, Element: 'Hi' }, {Time: 25,Element:'Hello' }, { Time: 35, Element: 'Hello' }, { Time: 20, Element: 'Hello' }], [{Time: 45,Element:'Hi' },{ Time: 55, Element: 'Hi'},{Time: 65, Element: 'Hi' }, {Time: 25,Element:'Hello'},{Time: 35, Element: 'Hello'},{Time: 20, Element: 'Hello'}, {Time:100, Element: 'Bye'}] ];
const timeElementSet = new Set();
const uniqueMergedArray = arrays.map(arr => arr.filter(obj => {
const key = `${obj.Time}$${obj.Element}`;
if (timeElementSet.has(key)) return false;
timeElementSet.add(key);
return true;
})).filter(arr => arr.length > 0);
console.log("Merged Array:", uniqueMergedArray);
上面使用
.map()
将每个内部数组转换为其自身的过滤版本。在过滤器函数中,我使用 Set
来跟踪通过创建 Time
形状的对象的序列化版本已经看到的 Element
和 Time$Element
对。这允许我们检查该对象是否已经被看到,然后我们可以使用它返回 true
/false
来保留当前元素。