javascript - 使用递归和减少来做一个数组的总和

标签 javascript arrays recursion

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

这是我尝试使用的示例数组: [[[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/

相关文章:

javascript - 如何沿给定路径拖动形状

javascript - JQuery Cleanup 并自动选择下一个 div 和导航项

javascript - 将 svg 从较低的 div 移动或克隆到顶部的 div

javascript - 数组变量 - 如何获取第一个 var

c# - 如何使用带有反射的递归来研究具有循环依赖的类实例?

javascript - 隐藏 20 :00 to 08:00 GMT 中的 HTML 元素

android - 无法将此字符串转换为 JSON

javascript - 按键值对 JSON 响应进行排序

c - 通过在堆上分配堆栈部分来避免堆栈溢出?

javascript - 使用递归函数按顺序进行多个ajax请求,并在所有请求完成后执行回调函数