Javascript 将两个对象数组相交,然后从两个对象数组中创建一个新数组

Javascript 将两个对象数组相交,然后从两个对象数组中创建一个新数组,javascript,arrays,object,ecmascript-6,Javascript,Arrays,Object,Ecmascript 6,我有两个对象数组: let arr1 = [ { id: "abdc4051", color: "red" }, { id: "abdc4052", color: "blue" } ]; let arr2 = [ { uid: "abdc4051", name: "wall" }, { u

我有两个对象数组:

    let arr1 = [
        { id: "abdc4051", color: "red" },
        { id: "abdc4052", color: "blue" }
    ];

    let arr2 = [
        { uid: "abdc4051", name: "wall" },
        { uid: "abdc4052", name: "kitchen" },
        { uid: "abdc4053", name: "sofa" },
        { uid: "abdc4054", name: "room" }
    ];
    
我需要通过id和uid进行连接,根据上面的示例,我希望得到以下结果:

    let arrNew = [
        { uid: "abdc4051", name: "wall",  color: "red" },
        { uid: "abdc4052", name: "kitchen", color: "blue" }
    ];
    
我想知道在ES6中使用哪种优雅的方式可以做到这一点?

let arr1=[
{id:“abdc4051”,颜色:“红色”},
{id:“abdc4052”,颜色:“蓝色”}
];
设arr2=[
{uid:“abdc4051”,名称:“wall”},
{uid:“abdc4052”,名字:“kitchen”},
{uid:“abdc4053”,名字:“sofa”},
{uid:“abdc4054”,名称:“房间”}
];
让result=arr2.map(eachinar2=>{
const matchedelementinar1=arr1.filter(eachInArr1=>eachInArr1.id==eachInArr2.uid);
if(matchedelementinar1.length==0){
返回null;
}
常数合并={
…MatchedElementinar1[0],
…每个中国2,
};
删除合并的['id'];
返回合并;
}).过滤器(每个=>每个);
控制台日志(结果);

我相当肯定这不算优雅,但我会这样做

const arr1 = [
        { id: "abdc4051", color: "red" },
        { id: "abdc4052", color: "blue" }
    ];

const arr2 = [
        { uid: "abdc4051", name: "wall" },
        { uid: "abdc4052", name: "kitchen" },
        { uid: "abdc4053", name: "sofa" },
        { uid: "abdc4054", name: "room" }
    ];

let arr3=[]
arr1.forEach(a1 => {
  arr2.forEach(a2 => {
    if (a1.id === a2.uid) {
      arr3.push({ uid: a1.id, color: a1.color, name: a2.name})
    }
  })
})

console.log(arr3)
也许是这样

const
arr1=
[{id:'abdc4051',颜色:'red'}
,{id:'abdc4052',颜色:'blue'}
] 
,arr2=
[{uid:'abdc4051',name:'wall'}
,{uid:'abdc4052',名称:'kitchen'}
,{uid:'abdc4053',名称:'sofa'}
,{uid:'abdc4054',名称:'room'}
] 
,result=arr1.reduce((a,{id,…a1N})=>
{
设{uid,…a2N}=arr2.find(x=>x.uid==id)|{uid:null}
如果(uid)
a、 推送({uid,…a2N,…a1N})
归还
},[])
console.log(结果)

.as console wrapper{max height:100%!important;top:0;}
您可以通过这种方式获得最高性能

因此,大的O(时间复杂度)只需要
max(arr1的O(N),arr2的O(N)

让arr1=[{id:“abdc4051”,颜色:“red”},
{id:“abdc4052”,颜色:“蓝色”}];
让arr2=[{uid:“abdc4051”,name:“wall”},
{uid:“abdc4052”,名字:“kitchen”},
{uid:“abdc4053”,名字:“sofa”},
{uid:“abdc4054”,名字:“room”}];
让结果=[],countIndex_1=0,countIndex_2=0;
while(countIndex_1
让arr1=[
{id:“abdc4051”,颜色:“红色”},
{id:“abdc4052”,颜色:“蓝色”}
];
设arr2=[
{uid:“abdc4051”,名称:“wall”},
{uid:“abdc4052”,名字:“kitchen”},
{uid:“abdc4053”,名字:“sofa”},
{uid:“abdc4054”,名称:“房间”}
];
设arr3=[];
arr1.map(item1=>{
arr3=arr3.concat(arr2.filter(item=>item1.id==item.uid));
arr3.map(item=>item1.id==item.uid?item.color=item1.color:“”);
} );
控制台日志(arr3)您可以使用

const arr1=[
{id:'abdc4051',颜色:'red'},
{id:'abdc4052',颜色:'blue'},
];
常数arr2=[
{uid:'abdc4051',名称:'wall'},
{uid:'abdc4052',名称:'kitchen'},
{uid:'abdc4053',name:'sofa'},
{uid:'abdc4054',name:'room'},
];
常数ret=[];
常量映射=新映射();
arr1.forEach(({id,color})=>map.set(id,{color}));
arr2.forEach(
({uid,name})=>map.has(uid)&&ret.push({uid,name,…map.get(uid)})
);

控制台日志(ret)
看看这是关于创建新的单个数组还是替换arr2数组?您的问题不清楚:如果
arr2[x]。uid
对于
arr1[n]不存在。ui
,则
arr1[n]
是否应该删除?问题应该是
将两个对象数组相交,然后从两个对象数组创建一个新数组
而不是
基于两个数组创建一个数组
哦,不,这样,性能太差了:(