我有两个像这样的对象数组:
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
的内容已添加到原始Tomorrow
,Monday
的对象已添加到上
我已经模糊地找到了如何使用嵌套循环来实现这一点,但我猜有一个使用map
、reduce
等更简单的解决方案。
这可以通过巧妙的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)