为了账号安全,请及时绑定邮箱和手机立即绑定

从数组中的另一个对象更新数组中的对象

从数组中的另一个对象更新数组中的对象

达令说 2021-04-25 12:57:37
在我的代码中,我有两个数组,第一个包含多个对象。第二个是存储序列化的表单数据(映射到JSON)。因此,两个数组都具有相同的键。我要实现的是,根据对象中的ID,根据新数组中对象的值动态地更新原始数组中对象的值。在网上找到了一些示例,但很难使它们起作用。因为它们中的大多数都显示了任一级别的对象,但是我正在处理数组中的复杂嵌套对象。var products = [    {        Id: 1,        Name: 'Product1',        Attributes: {            Storage: 'Normal',            Size: 'Small'        }    },    {        Id: 2,        Name: 'Product2',        Attributes: {            Storage: 'Normal',            Size: 'Small'        }    }];var newData = [    {        Id: 2,        Name: 'French Fries'    },    {        Id: 1,        Attributes: {            Size: 'Medium'        }    }];预期的结果是products现在使用第二个数组中的值更新该数组。Output:[    {        Id: 1,        Name: 'Product1',        Attributes: {            Storage: 'Normal',            Size: 'Medium'        }    },    {        Id: 2,        Name: 'French Fries',        Attributes: {            Storage: 'Normal',            Size: 'Small'        }    }]
查看完整描述

2 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

您可以创建一个组合嵌套对象的函数。然后使用map()和find()创建对象的组合数组。


var products = [

    {

        Id: 1,

        Name: 'Product1',

        Attributes: {

            Storage: 'Normal',

            Size: 'Small'

        }

    },

    {

        Id: 2,

        Name: 'Product2',

        Attributes: {

            Storage: 'Normal',

            Size: 'Small'

        }

    }

];


var newData = [

    {

        Id: 2,

        Name: 'French Fries'

    },

    {

        Id: 1,

        Attributes: {

            Size: 'Medium'

        }

    }

];


const haveNested = obj => Object.values(obj).some(x => typeof x === "object");


function combine(obj1,obj2){


  if(!haveNested(obj1)) return ({...obj1,...obj2})

  let res = obj1

  for(let key in obj1){

    if(typeof obj1[key] === "object"){

      res[key] = combine(obj1[key],obj2[key]);

    }

    else if(obj2[key]) res[key] = obj2[key]

  }

  return res;

}


const result = products.map(x => {

  let temp = newData.find(a => a.Id === x.Id);

  return temp ? combine(x,temp) : x;

})


console.log(result)


查看完整回答
反对 回复 2021-05-06
  • 2 回答
  • 0 关注
  • 235 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信