[英]Comparing and changing two Arrays of Objects
I want to compare each object of two arrays. 我想比较两个数组的每个对象。 If array1's property name matches with the array2's property name then change the value of array2's from array1. 如果array1的属性名称与array2的属性名称匹配,则从array1更改array2的值。
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: []
},
]
expected return a new array set from array2 - 期望从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' ]
}
},
]
I tried with the nested map inside the map. 我尝试了地图中的嵌套地图。 getting messy. 变得凌乱。 thanks in advance :) 提前致谢 :)
Use map
and find
. 使用map
并find
。
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:[]},]; const res = array2.map(e => { let found = array1.find(({ name }) => name == e.name); if (found) e.values = found.values; return e; }); console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
You can also use filter
and get your result like this: 您也可以使用filter
并获得如下结果:
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:[]},]; var array2new = array2.filter(function(obj2) { return array1.filter(function(obj1) { if(obj1.name == obj2.name){ return obj2.values.push(obj1.values); }else{return obj2;} }); }); console.log(array2new)
You can use reduce
to solve this. 您可以使用reduce
来解决此问题。
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: [] }, ] const newArray2 = array2.reduce((newArray, currentObj) => { array1.forEach(baseObj => { if((baseObj.name == currentObj.name) && baseObj.values) { currentObj.values = baseObj.values; } }) newArray.push(currentObj); return newArray; }, []) console.log(newArray2);
You could take a Map
and assign found objects to the final object as result. 您可以获取Map
并将找到的对象分配给最终对象作为结果。
var array1 = [{ name: 'test1', values: ['a', 'b', 'c'] }, { name: 'test2', values: ['w,', 'q', 'q'] }], array2 = [{ name: 'test1', items: '...', settings: '...', values: [] }, { name: 'test9', items: '...', settings: '...', values: [] }, { name: 'test10', items: '...', settings: '...', values: [] }, { name: 'test2', items: 'test2', settings: '...', values: [] }], map = new Map(array1.map(o => [o.name, o])), result = array2.map(o => Object.assign({}, o, map.get(o.name))); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
I would also advice you to use Array#reduce method: 我也建议你使用Array#reduce方法:
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: [] }, ] let arr = [...array2, ...array1].reduce((a,c) => { let filtered = a.filter(el => el.name === c.name); if(filtered.length){ Object.assign(filtered[0], c); }else{ a.push(c); } return a; }, []); console.log(JSON.stringify(arr));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.