Javascript 从阵列中的另一个对象更新阵列中的对象
在我的代码中,我有两个数组,第一个数组包含多个对象。第二个是存储映射到JSON的序列化表单数据。所以两个数组都有相同的键 我想要实现的是,根据对象中的ID,根据新数组中对象的值动态更新原始数组中对象的值 在网上找到了一些例子,但很难让它们发挥作用。因为它们中的大多数都显示一个级别的对象,但我正在处理数组中的复杂嵌套对象Javascript 从阵列中的另一个对象更新阵列中的对象,javascript,jquery,arrays,json,object,Javascript,Jquery,Arrays,Json,Object,在我的代码中,我有两个数组,第一个数组包含多个对象。第二个是存储映射到JSON的序列化表单数据。所以两个数组都有相同的键 我想要实现的是,根据对象中的ID,根据新数组中对象的值动态更新原始数组中对象的值 在网上找到了一些例子,但很难让它们发挥作用。因为它们中的大多数都显示一个级别的对象,但我正在处理数组中的复杂嵌套对象 var products = [ { Id: 1, Name: 'Product1', Attributes: {
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的输出应具有存储:正常。谢谢你指出,好的。身份证是唯一的吗?您可以通过该键引用项目以进行查找吗?我尝试了您的解决方案,但似乎在更新嵌套属性时,它将更新的属性添加到根键,而不是其自己的父键。并且包含实际密钥的父密钥保持不变。可能您的数据不一致。