Javascript 比较和更改两个对象数组
我想比较两个数组中的每个对象。如果array1的属性名称与array2的属性名称匹配,则将array2的值从array1更改为array2Javascript 比较和更改两个对象数组,javascript,arrays,object,ecmascript-6,Javascript,Arrays,Object,Ecmascript 6,我想比较两个数组中的每个对象。如果array1的属性名称与array2的属性名称匹配,则将array2的值从array1更改为array2 let array1 = [{ name: 'test1', values: ['a', 'b', 'c'] }, { name: 'test2', values: ['w,','q','q' ] } ] let array2 = [{ name: '
let array1 = [{
name: 'test1',
values: ['a', 'b', 'c']
},
{
name: 'test2',
values: ['w,','q','q' ]
}
]
let array2 = [{
name: 'test1',
items: '...',
settings: '...',
values: []
},
{
name: 'test9',
items: '...',
settings: '...',
values: []
},
{
name: 'test10',
items: '...',
settings: '...',
values: []
},
{
name: 'test2',
items: 'test2',
settings: '...',
values: []
},
]
预期从array2返回一个新数组集-
let array2New = [{
name: 'test1',
items: '...',
settings: '...',
values: ['a', 'b', 'c']
},
{
name: 'test9',
items: '...',
settings: '...',
values: []
},
{
name: 'test10',
items: '...',
settings: '...',
values: []
},
{
name: 'test2',
items: 'test2',
settings: '...',
values: ['w,','q','q' ]
}
},
]
我试着将嵌套贴图放在贴图中。越来越乱。
提前感谢:)使用
map
和find
let array1=[{name:'test1',value:['a','b','c']},{name:'test2',value:['w','q','q']}];
让array2=[{name:'test1',items:''.'设置:'.'.'.',值:[]},{name:'test9',items:'.''.''.',设置:'.'.'.'.'.'.''.'.'.'.'.'.'.'.'.'.'.''.''.'.''.''.'.''.'.'.'.''''.'.'''.''.'.'.'''.''.''''.'''.'';
常量res=array2.map(e=>{
让found=array1.find(({name})=>name==e.name);
如果(发现)e.values=found.values;
返回e;
});
控制台日志(res)代码>
。作为控制台包装{max height:100%!important;top:auto;}
您可以使用reduce
来解决此问题
让数组1=[{
名称:“test1”,
值:['a','b','c']
},
{
名称:“test2”,
值:['w','q','q']
}
]
设array2=[{
名称:“test1”,
项目:“…”,
设置:“…”,
值:[]
},
{
名称:“test9”,
项目:“…”,
设置:“…”,
值:[]
},
{
名称:“test10”,
项目:“…”,
设置:“…”,
值:[]
},
{
名称:“test2”,
项目:“test2”,
设置:“…”,
值:[]
},
]
const newArray2=array2.reduce((newArray,currentObj)=>{
array1.forEach(baseObj=>{
if((baseObj.name==currentObj.name)&&baseObj.values){
currentObj.values=基本Obj.values;
}
})
newArray.push(currentObj);
返回新数组;
}, [])
console.log(newArray2)代码>您可以选择一个并将找到的对象作为结果分配给最终对象
var array1=[{name:'test1',值:['a','b','c']},{name:'test2',值:['w','q','q']},
array2=[{name:'test1',items:'…',settings:'…',value:[]},{name:'test9',items:'…',settings:'test10',items:'…',settings:'…',value:[]},{name:'test2',items:'test2',settings:'…',value:[]},
map=newmap(array1.map(o=>[o.name,o]),
result=array2.map(o=>Object.assign({},o,map.get(o.name));
控制台日志(结果)代码>
。作为控制台包装{max height:100%!important;top:0;}
您还可以使用过滤器
并获得如下结果:
let array1=[{name:'test1',value:['a','b','c']},{name:'test2',value:['w','q','q']}];
让array2=[{name:'test1',items:''.'设置:'.'.'.',值:[]},{name:'test9',items:'.''.''.',设置:'.'.'.'.'.'.''.'.'.'.'.'.'.'.'.'.'.''.''.'.''.''.'.''.'.'.'.''''.'.'''.''.'.'.'''.''.''''.'''.'';
var array2new=array2.filter(函数(obj2){
返回阵列1.过滤器(功能(obj1){
if(obj1.name==obj2.name){
返回obj2.values.push(obj1.values);
}else{return obj2;}
});
});
console.log(array2new)
我还建议您使用以下方法:
让数组1=[{
名称:“test1”,
值:['a','b','c']
},
{
名称:“test2”,
值:['w','q','q']
}
]
设array2=[{
名称:“test1”,
项目:“…”,
设置:“…”,
值:[]
},
{
名称:“test9”,
项目:“…”,
设置:“…”,
值:[]
},
{
名称:“test10”,
项目:“…”,
设置:“…”,
值:[]
},
{
名称:“test2”,
项目:“test2”,
设置:“…”,
值:[]
},
]
设arr=[…array2,…array1]。reduce((a,c)=>{
让filtered=a.filter(el=>el.name==c.name);
如果(过滤的长度){
Object.assign(过滤[0],c);
}否则{
a、 推(c);
}
返回a;
}, []);
log(JSON.stringify(arr))代码>谢谢您的解决方案。直截了当。