使用递归和归约法做一个数组的总和

时间:2019-06-28 18:28:36

标签: 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,我在做我还不知道的错误吗?

谢谢您的时间

2 个答案:

答案 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))