我目前正在使用for和findIndex来更新主result变量中的总数。有没有其他方法可以重写这段代码,使其更短或更具可读性?
const payload = [
{ Id: 1, Total: 5 },
{ Id: 3, Total: 2 },
]
const result = {
Items: [
{ Id: 1, Name: 'Item 1 A', Total: 1, Type: "Main"},
{ Id: 1, Name: 'Item 1 B', Total: 0},
{ Id: 2, Name: 'Item 2 C', Total: 1, Type: "Main"},
{ Id: 2, Name: 'Item 2 D', Total: 0},
{ Id: 3, Name: 'Item 3 E', Type: "Main"},
{ Id: 3, Name: 'Item 3 F', Total: 0},
]
}
for(const itemPayload of payload) {
const itemIndex = result.Items.findIndex(item => item.Id === itemPayload.Id && item.Type === "Main");
if (itemIndex !== -1) {
result.Items[itemIndex].Total = itemPayload.Total;
}
}
console.log(result);
发布于 2019-11-25 01:50:43
在这里,我们创建了一个Map,然后在循环中访问它。它更整洁,可读性更好。
const payload = [
{ Id: 1, Total: 5 },
{ Id: 3, Total: 2 },
]
const result = {
Items: [
{ Id: 1, Name: 'Item 1 A', Total: 1, Type: "Main" },
{ Id: 1, Name: 'Item 1 B', Total: 0 },
{ Id: 2, Name: 'Item 2 C', Total: 1, Type: "Main" },
{ Id: 2, Name: 'Item 2 D', Total: 0 },
{ Id: 3, Name: 'Item 3 E', Type: "Main" },
{ Id: 3, Name: 'Item 3 F', Total: 0 },
]
};
const payloadMap = payload.reduce((map, obj) => {
map[obj.Id] = obj.Total;
return map;
}, {});
result.Items = result.Items.map(item => {
if (item.Type === 'Main' && payloadMap[item.Id]) {
item.Total = payloadMap[item.Id];
}
return item;
});
console.log(result);
发布于 2019-11-25 01:20:50
您可以将有效负载转换为映射,然后仅循环result.Items一次(而不是通过findIndex重复执行):
const payloadMap = new Map(payload.map(({Id, Total}) => [Id, Total]));
for (const item of result.Items) {
if (item.Type === "Main") {
const total = payloadMap.get(item.Id);
if (total !== undefined) {
item.Total = total;
}
}
}现场示例:
const payload = [
{ Id: 1, Total: 5 },
{ Id: 3, Total: 2 },
]
const result = {
Items: [
{ Id: 1, Name: 'Item 1 A', Total: 1, Type: "Main"},
{ Id: 1, Name: 'Item 1 B', Total: 0},
{ Id: 2, Name: 'Item 2 C', Total: 1, Type: "Main"},
{ Id: 2, Name: 'Item 2 D', Total: 0},
{ Id: 3, Name: 'Item 3 E', Type: "Main"},
{ Id: 3, Name: 'Item 3 F', Total: 0},
]
}
// Convert the payload to a Map:
const payloadMap = new Map(payload.map(({Id, Total}) => [Id, Total]));
// Loop through `result.Items` just once:
for (const item of result.Items) {
if (item.Type === "Main") {
const total = payloadMap.get(item.Id);
if (total !== undefined) {
item.Total = total;
}
}
}
console.log(result);
映射针对随机访问检索进行了优化。
另一种选择是除了result中的type = "Main"项的数组之外,还可以有一个Map of add项,两者都引用相同的对象,但这意味着当您向数组添加/从数组中删除时,您还必须在Map中添加/删除。
发布于 2019-11-25 01:21:03
如果这就是你要找的,你可以试试这样的东西。
const payload = [{
Id: 1,
Total: 5
},
{
Id: 3,
Total: 2
},
]
const result = {
Items: [{
Id: 1,
Name: 'Item 1 A',
Total: 1,
Type: "Main"
},
{
Id: 1,
Name: 'Item 1 B',
Total: 0
},
{
Id: 2,
Name: 'Item 2 C',
Total: 1,
Type: "Main"
},
{
Id: 2,
Name: 'Item 2 D',
Total: 0
},
{
Id: 3,
Name: 'Item 3 E',
Type: "Main"
},
{
Id: 3,
Name: 'Item 3 F',
Total: 0
},
]
}
let newdata = result.Items.map(ele => {
if (ele.Type == "Main") {
let payload_ = payload.find(e => e.Id == ele.Id);
if (payload_) {
ele.Total = payload_.Total;
}
}
return ele;
})
console.log(newdata);
https://stackoverflow.com/questions/59020315
复制相似问题