javascript - 使用递归查找数组中对象值的总和
问题描述
我正在尝试使用递归来完成任务的总和。一个对象代表一个团队成员,他们可以管理其他成员。
var team = {
name: 'Rufus',
completedTasks: 4,
manages: [
{
name: 'Clara',
completedTasks: 6,
manages: [
{
name: 'Dana',
completedTasks: 12,
manages: []
}
]
},
{
name: 'Charles',
completedTasks: 19,
manages: []
}
]
};
这是我已经实现的,但我没有得到 41。4 + 6 + 12 + 19 = 41。函数返回 45。
var totalTasks = function (team) {
var sum = 0;
var innerFunction = function(obj) {
if (obj.manages.length === 0) {
sum += obj.completedTasks;
return;
}
obj.manages.forEach(function(item) {
sum += obj.completedTasks;
innerFunction(item);
});
};
innerFunction(team);
return sum;
};
totalTasks(team);
解决方案
发生这种情况是因为在您的forEach
循环中添加obj.completedTasks
了与循环项无关的内容,因此您在每次迭代中添加了相同的数字。
无条件地将添加限制为仅添加obj.completedTasks
一次(作为第一件事)。所以:
var team = {name: 'Rufus',completedTasks: 4,manages: [{name: 'Clara',completedTasks: 6,manages: [{name: 'Dana',completedTasks: 12,manages: []}]},{name: 'Charles',completedTasks: 19,manages: []}]};
var totalTasks = function (team) {
var sum = 0;
var innerFunction = function(obj) {
sum += obj.completedTasks;
if (obj.manages.length === 0) return;
obj.manages.forEach(innerFunction);
};
innerFunction(team);
return sum;
};
console.log(totalTasks(team));
如果您不sum
作为非局部变量进行管理,而只是递归地累积它,那就更好了:
var team = {name: 'Rufus',completedTasks: 4,manages: [{name: 'Clara',completedTasks: 6,manages: [{name: 'Dana',completedTasks: 12,manages: []}]},{name: 'Charles',completedTasks: 19,manages: []}]};
var totalTasks = team =>
team.completedTasks +
team.manages.reduce((sum, child) => sum + totalTasks(child), 0);
console.log(totalTasks(team));
推荐阅读
- json - 引用 JSON 中的对象以及嵌套的内容
- ios - JSONDecoder 在 TestFlight / AppStore 上崩溃
- ios - nativescript sidekick cloud build 无法执行 firebase 挂钩
- c# - 使工具提示不可见
- reactjs - 在 React Hooks 中更新状态的问题
- java - 如何根据来自 GUI 组件的值获得不同的行为?
- azure - 如何调试/故障排除 Azure Cosmos DB(表 API)上的元数据 DTU 限制?
- java - Netbeans + Maven(更新中央存储库)
- dart - JS 互操作适用于 DDC,但不适用于 Dart2JS
- python - 根据列值计算 Pandas 中的 TimeDiff