Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 使用hashtables或hashmap使用其他数组中的值更新数组中的对象值_Javascript_Arrays_Hash - Fatal编程技术网

Javascript 使用hashtables或hashmap使用其他数组中的值更新数组中的对象值

Javascript 使用hashtables或hashmap使用其他数组中的值更新数组中的对象值,javascript,arrays,hash,Javascript,Arrays,Hash,我有两个数组Array1和Array2,我正在用数组2中相同对象(具有相同ID)的速率更新Array1中对象的速率。我有一个函数,它在两个数组中循环以获得所需的结果。在阅读了关于堆栈溢出的一些答案之后,我觉得哈希表最适合于降低复杂性。我只是想知道如何使用has映射实现同样的功能 让数组1=[{ id:1, 名称:“冰淇淋”, 详情:[{ id:“12”, 名称:“牛奶”, 数量:“50”, 比率:“100” }, { id:“13”, 名称:“奶油”, 数量:“50”, 费率:“300” }

我有两个数组
Array1
Array2
,我正在用数组2中相同对象(具有相同ID)的速率更新
Array1
中对象的速率。我有一个函数,它在两个数组中循环以获得所需的结果。在阅读了关于堆栈溢出的一些答案之后,我觉得哈希表最适合于降低复杂性。我只是想知道如何使用has映射实现同样的功能

让数组1=[{
id:1,
名称:“冰淇淋”,
详情:[{
id:“12”,
名称:“牛奶”,
数量:“50”,
比率:“100”
},
{
id:“13”,
名称:“奶油”,
数量:“50”,
费率:“300”
}
]
},
{
id:2,
名称:“咖啡”,
详情:[{
id:“14”,
名称:“咖啡豆”,
数量:“60”,
比率:“200”
},
{
身份证号码:“15”,
名称:“水”,
数量:“60”,
费率:“300”
}
]
},
{
id:3,
名称:“茶”,
详情:[{
id:“16”,
名称:“茶叶”,
数量:“50”,
比率:“700”
}]
}
]
设Array2=[{
id:1,
名称:“冰淇淋”,
详情:[{
id:“12”,
名称:“牛奶”,
数量:“50”,
费率:“500”
},
{
id:“13”,
名称:“奶油”,
数量:“50”,
比率:“700”
}
]
},
{
id:2,
名称:“咖啡”,
详情:[{
id:“14”,
名称:“咖啡豆”,
数量:“60”,
费率:“800”
},
{
身份证号码:“15”,
名称:“水”,
数量:“60”,
费率:“8000”
}
]
}
]
Array1=Array1.map(项=>{
让element=Array2.find(e=>e.id==item.id);
if(元素){
item.details=item.details.map(e=>{
让detail=element.details.find(d=>d.id==e.id);
如果(细节)
e、 比率=细节。比率;
返回e;
});
}
退货项目;
});

控制台日志(Array1)
Array2
的项目(按id)和
Array2
的每个细节(按id)绘制一个映射,然后您可以迭代
Array1
并以低复杂度更改其属性:

const items2ById = {};
for (const item of Array2) {
  items2ById[item.id] = item;
}
const items2DetailsById = {};
for (const detail of Array2.flatMap(({ details }) => details)) {
  items2DetailsById[detail.id] = detail;
}
for (const item of Array1) {
  if (!items2ById[item.id]) continue;
  for (const detail of item.details) {
    if (items2DetailsById[detail.id]) {
      detail.rate = items2DetailsById[detail.id].rate;
    }
  }
}
请注意,由于您正在对现有对象进行变异,
.map
并不真正合适,因为您并不真正关心创建一个新数组-相反,只需在数组上迭代并根据需要进行变异

让数组1=[{
id:1,
名称:“冰淇淋”,
详情:[{
id:“12”,
名称:“牛奶”,
数量:“50”,
比率:“100”
},
{
id:“13”,
名称:“奶油”,
数量:“50”,
费率:“300”
}
]
},
{
id:2,
名称:“咖啡”,
详情:[{
id:“14”,
名称:“咖啡豆”,
数量:“60”,
比率:“200”
},
{
身份证号码:“15”,
名称:“水”,
数量:“60”,
费率:“300”
}
]
},
{
id:3,
名称:“茶”,
详情:[{
id:“16”,
名称:“茶叶”,
数量:“50”,
比率:“700”
}]
}
]
设Array2=[{
id:1,
名称:“冰淇淋”,
详情:[{
id:“12”,
名称:“牛奶”,
数量:“50”,
费率:“500”
},
{
id:“13”,
名称:“奶油”,
数量:“50”,
比率:“700”
}
]
},
{
id:2,
名称:“咖啡”,
详情:[{
id:“14”,
名称:“咖啡豆”,
数量:“60”,
费率:“800”
},
{
身份证号码:“15”,
名称:“水”,
数量:“60”,
费率:“8000”
}
]
}
];
const items2ById={};
用于(阵列2的施工项目){
items2ById[item.id]=项目;
}
const items2DetailsById={};
for(Array2.flatMap(({details})=>details)的常量细节){
items2DetailsById[detail.id]=详细信息;
}
用于(阵列1的常数项){
如果(!items2ById[item.id])继续;
用于(项目的施工详图。详图){
if(items2DetailsById[detail.id]){
detail.rate=items2DetailsById[detail.id].rate;
}
}
}

控制台日志(Array1)非常感谢这像魔术一样工作。我正在尝试了解地图。你能参考好的资源吗。再次感谢!!JS中的“映射”通常指的是一种数据结构,我在这里不使用它。
items2ById
items2DetailsById
只是普通对象,它们将属性名称连接到值。