如何将2个带有嵌套对象的数组合并为1个不重复的数组



我有两个像这样的对象数组:

const oldArr = [
{ 'Tomorrow': [{ id: 2 }, { id: 4 }, { id: 3 }] }, 
{ 'Saturday': [{ id: 2 }, { id: 4 }, { id: 3 }] }
]
const newArr = [
{ 'Monday': [{ id: 2 },{ id: 4},{ id: 3 }] }, 
{ 'Tomorrow': [{ id: 1 },{ id: 5 }]}
]

我想在没有任何重复密钥的情况下合并两者,所以它应该会导致:

[
{ 'Tomorrow': [{ id: 2 }, { id: 4 }, { id: 3 }, { id: 1 }, { id: 5 }] }, 
{ 'Saturday': [{ id: 2 }, { id: 4 }, { id: 3 }] },
{ 'Monday': [{ id: 2 }, { id: 4 }, { id: 3 }] } 
]

如您所见,Tomorrow的内容已添加到原始TomorrowMonday的对象已添加到上

我已经模糊地找到了如何使用嵌套循环来实现这一点,但我猜有一个使用mapreduce等更简单的解决方案。

这可以通过巧妙的javascript扩展语法、Array和Object原型函数以及析构函数模式的组合轻松实现。

[...oldArr, ...newArr].flatMap(Object.entries).reduce(
(acc, [k, v]) => ({ ...acc, [k]: [...acc[k]||[], ...v] }), {})

就这么简单

const oldArr = [
{'Tomorrow': [{'id':2},{'id':4},{'id':3}]}, 
{'Saturday': [{'id':2},{'id':4},{'id':3}]}
]
const newArr = [
{'Monday': [{'id':2},{'id':4},{'id': 3}]}, 
{'Tomorrow': [{'id':1},{'id':5}]}
]
const result = [...oldArr, ...newArr].flatMap(Object.entries).reduce(
(acc, [k, v]) => ({ ...acc, [k]: [...acc[k]||[], ...v] }), {})

console.log(result)


有关其工作原理的详细解释,请参阅类似问题的扩展答案。另一个问题的区别在于,每个内部对象只有一个对象作为值,而不是数组。

这可以通过迭代组合的数组来生成一个对象,其中包含数组中每个键的所有值;然后使用CCD_ 6将其映射回原始格式:

const oldArr = [
{'Tomorrow': [{'id':2},{'id':4},{'id':3}]}, 
{'Saturday': [{'id':2},{'id':4},{'id':3}]}
]
const newArr = [
{'Monday': [{'id':2},{'id':4},{'id': 3}]}, 
{'Tomorrow': [{'id':1},{'id':5}]}
]
const result = Object.entries(oldArr.concat(newArr)
.reduce((a, o) => {
let k = Object.keys(o)[0]
a[k] = (a[k] || []).concat(o[k])
return a
}, {})
).map(([k, v]) => ({ [k] : v}))
console.log(result)

相关内容

  • 没有找到相关文章

最新更新