gpt4 book ai didi

javascript - 如何在JavaScript中添加需要递归计算的新属性

转载 作者:行者123 更新时间:2023-11-28 12:14:18 25 4
gpt4 key购买 nike

我想使用映射动态地将新属性添加到数组中的所有项目。但是在将其添加到每个项目时,该属性的值是之前所有项目新添加的属性的总和

考虑这个例子:

let persons = [{
"name": "A",
"salary": 2
}, {
"name": "B",
"salary": 5
},{
"name":"C",
"salary":12
}];

我想返回:

[{
"name": "A",
"salary": 2,
"sumSalary":2
}, {
"name": "B",
"salary": 5,
"sumSalary":7
},{
"name":"C",
"salary":12,
"sumSalary":19
}];

我已经尝试过这个:

let mutatedPersons = persons.map((currentValue, index, mutatedPersons) => ({
...currentValue,
sumSalary: currentValue.name === 'A' ? currentValue.salary : mutatedPersons[index - 1].sumSalary + currentValue.salary
}))

但我一直收到这个:

[
0: {name: "A", salary: 2, sumSalary: 2}
1: {name: "B", salary: 5, sumSalary: NaN}
2: {name: "C", salary: 12, sumSalary: NaN}
]

最佳答案

您引用的 mutatedPersons 是原始数组(请参阅 map's parameters ),而不是更新后的数组,更新后的数组在 map 结束之前实际上并不存在。您可以将前一个总和缓存在外部变量 (prevSumSalary) 中,并将其用作新总和的基础:

const persons = [{ name: "A", salary: 2 }, { name: "B", salary: 5 }, { name: "C", salary: 12 }]

let prevSumSalary = 0;
const mutatedPersons = persons.map((currentValue, index) => ({
...currentValue,
sumSalary: (prevSumSalary = prevSumSalary + currentValue.salary)
}))

console.log(mutatedPersons);

另一个选择是使用 Array.reduce() ,因为您可以访问累积值:

const persons = [{ name: "A", salary: 2 }, { name: "B", salary: 5 }, { name: "C", salary: 12 }]

const mutatedPersons = persons.reduce((r, currentValue) => [...r,
({
...currentValue,
sumSalary: currentValue.salary + (r.length && r[r.length - 1].sumSalary)
})
], [])

console.log(mutatedPersons);

关于javascript - 如何在JavaScript中添加需要递归计算的新属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52795824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com