【问题标题】:Comparing and changing two Arrays of Objects比较和更改两个对象数组
【发布时间】:2019-06-06 07:54:22
【问题描述】:

我想比较两个数组的每个对象。如果array1 的属性名称与array2 的属性名称匹配,则将array2 的值​​从array1 更改。

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' ]
        }
    },
]

我尝试使用地图内的嵌套地图。变得凌乱。 在此先感谢:)

【问题讨论】:

    标签: javascript arrays object ecmascript-6


    【解决方案1】:

    使用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; }

    【讨论】:

    • 感谢您的解决方案。直截了当。
    【解决方案2】:

    您也可以使用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)

    【讨论】:

      【解决方案3】:

      你可以使用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);

      【讨论】:

        【解决方案4】:

        您可以使用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; }

        【讨论】:

          【解决方案5】:

          我还建议您使用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));

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-05-13
            • 2020-01-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多