猿问

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

在我的代码中,我有两个数组,第一个包含多个对象。第二个是存储序列化的表单数据(映射到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'

        }

    }

]


达令说
浏览 236回答 2
2回答

守候你守候我

您可以创建一个组合嵌套对象的函数。然后使用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)
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答