Javascript 合并两个对象数组,并根据对象内部的密钥更新对象

Javascript 合并两个对象数组,并根据对象内部的密钥更新对象,javascript,arrays,Javascript,Arrays,我有两个数组对象array1和array2,我想根据键名合并数据 array1= [ { name:"adam", data:[ ] }, { name:"eve", data:[ [ "child" ],

我有两个数组对象array1和array2,我想根据键名合并数据

array1= [
    {
        name:"adam",
        data:[
            
        ]
    },
    {
        name:"eve",
        data:[
            [
                "child"
            ],
            [
                "secondchild"
            ]
        ]
    }
]
输出应该是

result= [
    {
        name:"adam",
        data:[
            [
                "thirdchild"
            ],
            [
                "fourthchild"
            ]
        ]
    },
    {
        name:"eve",
        data:[
            [
                "child"
            ],
            [
                "secondchild"
            ]
        ]
    }
]
我已经能够获得对象索引,但我无法将数组推入数据,我无法在这里写下代码,因为我正在虚拟机上工作。任何提示或帮助都将不胜感激

我正在运行一个数组1的映射,在它里面,我正在运行另一个数组2的映射,但我不认为这是优化的方式

array1.map(el => {
array2.map(es => {
if(el.name === es.name){
/// here I am doing the logic , is there any optimized ways 
}
})})
让数组1=[
{
名字:“亚当”,
数据:[
]
},
{
姓名:“夏娃”,
数据:[
[
“孩子”
],
[
“第二个孩子”
]
]
}
]
设array2=[
{
名字:“亚当”,
数据:[
[
“第三个孩子”
],
[
“第四个孩子”
]
]
},
{
姓名:“夏娃”,
数据:[
]
}
]
设r=array1.map(行=>{
row.data=[…row.data,…array2.find(f=>f.name===row.name)?.data???[];
返回行;
})

控制台日志(r)首先,如果数组中的元素数量不是太多,那么实际上没有必要担心这是否得到了优化

假设数组中的元素数量太多,以致嵌套循环(
O(n^2)
)成为问题,您可以使用
name
作为键创建一个数组元素的临时映射,然后在迭代另一个数组时进行匹配

常量数组1=[{
名字:“亚当”,
数据:[
]
},
{
姓名:“夏娃”,
数据:[
[
“孩子”
],
[
“第二个孩子”
]
]
}
];
常数数组2=[{
名字:“亚当”,
数据:[
[
“第三个孩子”
],
[
“第四个孩子”
]
]
},
{
姓名:“夏娃”,
数据:[
]
}
];
常数a1Map=array1.reduce((map,a1)=>{
map[a1.name]=a1;
返回图;
}, {});
const result=array2.map(a2=>{
返回{
姓名:a2.name,
数据:[…a1Map[a2.name]。数据,…a2.data]
}
});

console.log(result)
只需将两个数组转换为键映射对象,这样我们就避免了一些数组函数调用开销

keymap = {};//both of arrays will be mapped here

array1.map(e => {
    if(keymap[e.name]){
        keymap[e.name].data = [...keymap[e.name].data, ...e.data];
    }else{
        keymap[e.name] = {data: e.data};
    }
});

array2.map(e => {
    if(keymap[e.name]){//merge arrays
        keymap[e.name].data = [...keymap[e.name].data, ...e.data];
    }else{
        keymap[e.name] = {data: e.data};
    }
});
然后根据关键映射生成结果

//make result from keymap:
result = [];
for (var key in keymap) { 
    if (!keymap.hasOwnProperty(key)) continue;//avoid processing native properties... 
    result.push({name: key, data: keymap[key].data}); 
}

你能指出这和OP已经在做的有什么不同吗?您刚刚将
array2.map
name
array2.find
进行了比较,我认为它们做的是相同的事情。array.find在到达elem时会中断循环。是的,它是o(n2),但比完整的地图好。在我看来,o(n2)比在内存中创建另一个数组要好。优化不仅仅是算法的时间复杂度@马扎迪感谢澄清。如果你把它作为你答案的一部分来解释会更好。只有代码的答案通常很难让OP理解。如果初始数组2有一个额外的对象,如{name:“michael”,data:[]},它应该添加新对象。它应该将整个对象推到最终数组中。最终结果应该是[{“name”:“adam”,“data”:[[“thirdchild”],[“第四个孩子”]},{“名字”:“伊夫”,“数据”:[“孩子”],[“第二个孩子”]},{name:“迈克尔”,数据:[]}]@MohammadZubair您可以通过检查
array2.map(…)
中的
a1Map[a2.name]
是否存在来实现这一点。
//make result from keymap:
result = [];
for (var key in keymap) { 
    if (!keymap.hasOwnProperty(key)) continue;//avoid processing native properties... 
    result.push({name: key, data: keymap[key].data}); 
}