Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从阵列中的另一个对象更新阵列中的对象_Javascript_Jquery_Arrays_Json_Object - Fatal编程技术网

Javascript 从阵列中的另一个对象更新阵列中的对象

Javascript 从阵列中的另一个对象更新阵列中的对象,javascript,jquery,arrays,json,object,Javascript,Jquery,Arrays,Json,Object,在我的代码中,我有两个数组,第一个数组包含多个对象。第二个是存储映射到JSON的序列化表单数据。所以两个数组都有相同的键 我想要实现的是,根据对象中的ID,根据新数组中对象的值动态更新原始数组中对象的值 在网上找到了一些例子,但很难让它们发挥作用。因为它们中的大多数都显示一个级别的对象,但我正在处理数组中的复杂嵌套对象 var products = [ { Id: 1, Name: 'Product1', Attributes: {

在我的代码中,我有两个数组,第一个数组包含多个对象。第二个是存储映射到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'
        }
    }
];
预期的结果是现在使用第二个数组中的值更新产品数组

Output:
[
    {
        Id: 1,
        Name: 'Product1',
        Attributes: {
            Storage: 'Normal',
            Size: 'Medium'
        }
    },
    {
        Id: 2,
        Name: 'French Fries',
        Attributes: {
            Storage: 'Normal',
            Size: 'Small'
        }
    }
]
您可以对更新项和迭代产品进行测试

如果找到要更新的项,则采用递归方法并迭代条目,检查值是否为对象,然后迭代嵌套属性

如果未找到嵌套对象,请更新属性

这也适用于阵列

函数updatetarget,源代码{ Object.entriessource.forEach[键,值]=>{ 如果value&&typeof value==='object'{ updatetarget[key]=target[key]| | Array.isArrayvalue?[]:{},value; }如果目标[键]!==值,则为else{ 目标[键]=值; } }; } var products=[{Id:1,名称:'Product1',属性:{Storage:'Normal',Size:'Small'}},{Id:2,名称:'Product2',属性:{Storage:'Normal',Size:'Small'}], newData=[{Id:2,Name:'French Fries'},{Id:1,Attributes:{Size:'Medium'}], map=newmapnewdata.mapo=>[o.Id,o]; products.forEacho=>map.haso.Id&&updateo,map.geto.Id; 控制台产品;
.作为控制台包装{max height:100%!important;top:0;}您可以创建一个组合嵌套对象的函数。然后使用map和find创建对象的组合数组

var乘积=[ { Id:1, 名称:“产品1”, 属性:{ 存储:'正常', 尺寸:“小” } }, { Id:2, 名称:“产品2”, 属性:{ 存储:'正常', 尺寸:“小” } } ]; var newData=[ { Id:2, 名称:“炸薯条” }, { Id:1, 属性:{ 尺码:“中等” } } ]; const haveNested=obj=>Object.valuesobj.somex=>typeof x==Object; 函数组合obj1,obj2{ if!haveNestedobj1返回{…obj1,…obj2} 设res=obj1 obj1中的forlet键{ iftypeof obj1[键]==对象{ res[key]=组合bj1[key],obj2[key]; } 否则ifobj2[key]res[key]=obj2[key] } 返回res; } const result=products.mapx=>{ 让temp=newData.finda=>a.Id==x.Id; 返回温度?combinex,温度:x; }
console.logresultWhy第一个对象中的大小未更改。它应该已更改为“中”,因为在id为1的newData对象中,其大小为medium@MaheerAli哦,是的,你是对的。现在更正它。谢谢你的指点。2只有尺寸的标准是什么:小而不是存储空间:也正常吗?。。。当1更新其属性时。@briosheje很抱歉,这纯粹是个错误。2的输出应具有存储:正常。谢谢你指出,好的。身份证是唯一的吗?您可以通过该键引用项目以进行查找吗?我尝试了您的解决方案,但似乎在更新嵌套属性时,它将更新的属性添加到根键,而不是其自己的父键。并且包含实际密钥的父密钥保持不变。可能您的数据不一致。