如何解决使用哈希表或哈希表使用其他数组中的值更新数组中的对象值
我有两个数组Array1
和Array2
,我用数组2中相同对象(具有相同ID)的比率更新Array1
中对象的比率。我有一个函数遍历两个数组以获得所需的结果。在对堆栈溢出进行了一些回答之后,我觉得哈希表最适合降低复杂性。我只是很想知道如何使用has映射来实现相同的功能。
let Array1 = [{
id: 1,name: "IceCream",details: [{
id: "12",name: "milk",quantity: "50",rate: "100"
},{
id: "13",name: "cream",rate: "300"
}
]
},{
id: 2,name: "Coffee",details: [{
id: "14",name: "Coffee bean",quantity: "60",rate: "200"
},{
id: "15",name: "water",{
id: 3,name: "Tea",details: [{
id: "16",name: "Tea leaf",rate: "700"
}]
}
]
let Array2 = [{
id: 1,rate: "500"
},rate: "700"
}
]
},rate: "800"
},rate: "8000"
}
]
}
]
Array1 = Array1.map(item => {
let element = Array2.find(e => e.id == item.id);
if (element) {
item.details = item.details.map(e => {
let detail = element.details.find(d => d.id == e.id);
if (detail)
e.rate = detail.rate;
return e;
});
}
return item;
});
console.log(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
并不合适,因为您实际上并不希望创建一个新数组-而是迭代该数组并根据需要对其进行突变
let Array1 = [{
id: 1,name: "IceCream",details: [{
id: "12",name: "milk",quantity: "50",rate: "100"
},{
id: "13",name: "cream",rate: "300"
}
]
},{
id: 2,name: "Coffee",details: [{
id: "14",name: "Coffee bean",quantity: "60",rate: "200"
},{
id: "15",name: "water",{
id: 3,name: "Tea",details: [{
id: "16",name: "Tea leaf",rate: "700"
}]
}
]
let Array2 = [{
id: 1,rate: "500"
},rate: "700"
}
]
},rate: "800"
},rate: "8000"
}
]
}
];
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;
}
}
}
console.log(Array1);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。