Javascript Array.reduce() 破坏页面,错误代码为 6

Javascript Array.reduce() breaking the page with Error Code 6

只要我不传递初始值,该网页就可以正常工作,但在那种情况下,它只会给我 TypeError 因为只有最后一个元素(如预期的那样)。这就是为什么我试图将 0 作为初始值传递给 reduce 函数(下面代码片段的第 4 行)。但是一旦我这样做,它就会破坏整个页面并显示错误代码 6。

我要实现的目标: 我将数组中所有元素的总和相加,然后将该总和推入另一个数组,删除第一个元素并重复该过程。当没有剩余元素时,我想从 reduce() 函数中得到 return 0,这就是为什么我试图传递一个初始值 (0)。

function partsSums(ls) {
  let sumArr = [];
  while (ls.length >= 0) {
    sumArr.push(ls.reduce((acc, cur) => acc + cur, 0));
    ls.shift();
  }
  return sumArr;
}

partsSums([0, 1, 3, 6, 10]);

我正在寻找的输出是:[20, 20, 19, 16, 10, 0]

您的代码的问题是条件 ls.length >= 0。这种情况会导致您进入无限循环。将其更改为 ls.length > 0

建议

看来你是求从右到左的累加求和。但是你的函数不是cost-effective。您可以使用 suffix-sum 解决此问题。

const suffixSum = arr => {
  const res = [];
  const {length} = arr;
  res[length] = 0;

  for (let i = length - 1; i >= 0; i--) {
    res[i] = res[i+1] + arr[i];
  }
  
  return res;
}

console.log(suffixSum([0, 1, 3, 6, 10]));

此算法需要 O(n) 时间,而您的算法需要 O(n^2) 时间。

你可以做到:

function partsSums(ls)
  {
  let sumArr = []
    , lng    = ls.length
    ;
  while ( lng >= 0)
    {
    sumArr.push(ls.reduce((acc, cur) => acc + cur, 0))
    ls.shift()
    --lng
    }
  return sumArr
  }

console.log(JSON.stringify( partsSums([0, 1, 3, 6, 10])  ))
.as-console-wrapper { max-height: 100% !important; top: 0; }

如评论中所述,您将遇到无限循环,因为数组的长度永远不会低于 0

如其他答案所示,您可以通过将条件更改为 ls.length > 0 来解决该问题,但是您不会在最终迭代中将 0 推入结果的最终情况当数组为空时。

不要在 while() 条件下测试长度,而是在调用 reduce() 然后跳出循环后进行测试。

function partsSums(ls) {
  let sumArr = [];
  while (true) {
    sumArr.push(ls.reduce((acc, cur) => acc + cur, 0));
    if (ls.length == 0) {
      break;
    }
    ls.shift();
  }
  return sumArr;
}

console.log(partsSums([0, 1, 3, 6, 10]));