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]
是否应该删除?问题应该是将两个对象数组相交,然后从两个对象数组创建一个新数组
而不是基于两个数组创建一个数组
哦,不,这样,性能太差了:(