我想做一个递归函数以添加一个数组。
这是我要使用的示例数组:
[[[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,我在做我还不知道的错误吗?
谢谢您的时间
答案 0 :(得分:3)
您不再将初始值传递给reduce
。这样做,而不是尝试在化简函数中|| 0
acc
。
const reducer = (acc, x) => acc + (Array.isArray(x) ? sumItems(x) : x);
const sumItems = array => array.reduce(reducer, 0);
// ^
没有初始值,reduce
在空数组上失败。
答案 1 :(得分:3)
您需要在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))