我想做一个递归函数来添加一个数组。
这是我尝试使用的示例数组:
[[[1, 2, [[3], 4]], 5, []]]
自从我开始学习以来,我想用 reduce 来尝试它......它有时工作得很好:
const sumItems = function(array) {
return array.reduce(function(acc, x) {
return acc + (Array.isArray(x) ? sumItems(x) : x);
},0);
};
问题是,我希望能够缩短它......像这样:
const sumItems = function(array) {
const reducer = (acc, x) => (acc || 0) + (Array.isArray(x) ? sumItems(x) : x);
return array.reduce(reducer);
};
但这根本不起作用......我不确定为什么,虽然我一直在玩我的代码,控制台记录它等等,但我能得到的最好的输出是这样的:
[ [ 1, 2, [ [Array], 4 ] ], 5, [] ]
我觉得这很有趣......
有人知道我该如何解决这个问题吗?关于 JavaScript,我是否做错了什么我还没有意识到的事情?
谢谢你的时间
最佳答案
你需要在 reduce 方法中设置初始值,否则如果第一个元素是一个数组,那么它将失败并在某些迭代和下一次迭代中返回 NaN
acc || 0
将得到 0
,因为 NaN
是假值。
var data = [
[
[1, 2, [
[3], 4
]], 5, []
]
]
const sumItems = function(array) {
const reducer = (acc, x) => acc + (Array.isArray(x) ? sumItems(x) : x);
// -now || is not needed --^^^^----- since we'd added initial value so it will be always a number
// for treating non-digit or non-array value you can replace `x` with `+x || 0` for treating it as `0`
return array.reduce(reducer, 0);
// ---- initial value-------^^^----
};
console.log(sumItems(data))
关于javascript - 使用递归和减少来做一个数组的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56811705/