Javascript Array.reduce使用错误代码6中断页面 建议

问题描述

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

我要实现的目标: 我要添加数组中所有元素的总和,然后将该总和推到另一个数组中,删除一个元素,然后重复该过程。当没有剩余元素时,我想从reduce()函数返回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]

Error Screenshot

解决方法

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

建议

您似乎正在寻求从右到左的累加总和。但是您的功能并不划算。您可以使用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,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,0));
    if (ls.length == 0) {
      break;
    }
    ls.shift();
  }
  return sumArr;
}

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