Javascript 使用递归和reduce进行数组求和

Javascript 使用递归和reduce进行数组求和,javascript,arrays,recursion,Javascript,Arrays,Recursion,我想做一个递归函数来添加一个数组 下面是我尝试使用的示例阵列: [1,2,3,4,5,5] 因为我在学习,所以我想用reduce来试试。。。有时,它工作得很好: const sumItems = function(array) { return array.reduce(function(acc, x) { return acc + (Array.isArray(x) ? sumItems(x) : x); },0); }; 问题是,我很想缩短它。。。大概是这样的: const

我想做一个递归函数来添加一个数组

下面是我尝试使用的示例阵列: [1,2,3,4,5,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,4,5,

我觉得很有趣

有人知道我如何解决这个问题吗?关于JavaScript,我是否犯了一些我还没有意识到的错误


感谢您抽出时间

您不再传递要减少的初始值。这样做,而不是试图在减速器功能内| | 0 acc

const reducer = (acc, x) => acc + (Array.isArray(x) ? sumItems(x) : x);
const sumItems = array => array.reduce(reducer, 0);
//                                              ^

如果没有初始值,reduce将在空数组上失败。

您不再传递要reduce的初始值。这样做,而不是试图在减速器功能内| | 0 acc

const reducer = (acc, x) => acc + (Array.isArray(x) ? sumItems(x) : x);
const sumItems = array => array.reduce(reducer, 0);
//                                              ^

如果没有初始值,reduce将在空数组上失败。

您需要在reduce方法中设置初始值,否则,如果第一个元素是数组,那么它将在某个迭代中失败并返回NaN,而下一个迭代acc | 0将导致0,因为NaN是falsy值

风险值数据=[ [ [1, 2, [ [3], 4 ]], 5, [] ] ] const sumtimes=函数数组{ const reducer=acc,x=>acc+Array.isArrayx?sumtItemsx:x; //-现在不需要| |-^^^---因为我们已经添加了初始值,所以它将始终是一个数字 //要处理非数字或非数组值,可以将“x”替换为“+x | | 0”,将其处理为“0”` 返回array.reducer,0; //-初始值----^^^-- };
console.logsumitmsdata您需要在reduce方法中设置初始值,否则,如果第一个元素是数组,那么它将在某个迭代中失败并返回NaN,而下一个迭代acc | | 0将得到0,因为NaN是falsy值

风险值数据=[ [ [1, 2, [ [3], 4 ]], 5, [] ] ] const sumtimes=函数数组{ const reducer=acc,x=>acc+Array.isArrayx?sumtItemsx:x; //-现在不需要| |-^^^---因为我们已经添加了初始值,所以它将始终是一个数字 //要处理非数字或非数组值,可以将“x”替换为“+x | | 0”,将其处理为“0”` 返回array.reducer,0; //-初始值----^^^-- };
console.logsumitsdatament将数组中的初始值设置为0。类似于返回数组的reduce函数。reducereducer,0;它会按照你们的期望工作。非常感谢你们,你们两个。我希望我能检查这两个答案来给你评分,它们都很有启发性。在数组中提到初始值为0。reduce函数类似于返回数组。reducereducer,0;它会按照你们的期望工作。非常感谢你们,你们两个。我希望我能核对这两个答案来给你评分,它们都很有启发性。