简体   繁体   English

比较和更改两个对象阵列

[英]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 . 使用mapfind

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM