Javascript Array.reduce()以错误代码6中断页面

Javascript Array.reduce()以错误代码6中断页面,javascript,arrays,reduce,array.prototype.map,Javascript,Arrays,Reduce,Array.prototype.map,只要我不传递初始值,网页就可以正常工作,但在这种情况下,它只会给我TypeError,因为当只有最后一个元素时(如预期的那样)。这就是为什么我试图将0作为初始值传递给reduce函数(下面代码段的第4行)。但一旦我这么做,它就会用错误代码6破坏整个页面 我正在努力实现的目标: 我将添加数组中所有元素的总和,然后将该总和推送到另一个数组中,删除第一个元素并重复该过程。当没有剩余元素时,我希望从reduce()函数返回0,这就是我试图传递初始值(0)的原因 我想要的输出是:[20,20,19,16,

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

我正在努力实现的目标: 我将添加数组中所有元素的总和,然后将该总和推送到另一个数组中,删除第一个元素并重复该过程。当没有剩余元素时,我希望从reduce()函数返回0,这就是我试图传递初始值(0)的原因


我想要的输出是:
[20,20,19,16,10,0]


代码的问题在于条件
ls.length>=0
。这个条件会导致无限循环。将其更改为
ls.length>0

暗示 你似乎在寻求从右到左的累积总和。但你的功能并不划算。您可以使用
后缀sum
解决此问题

const后缀sum=arr=>{
常数res=[];
常数{length}=arr;
res[length]=0;
对于(设i=length-1;i>=0;i--){
res[i]=res[i+1]+arr[i];
}
返回res;
}

log(后缀([0,1,3,6,10])代码的问题在于条件
ls.length>=0
。这个条件会导致无限循环。将其更改为
ls.length>0

暗示 你似乎在寻求从右到左的累积总和。但你的功能并不划算。您可以使用
后缀sum
解决此问题

const后缀sum=arr=>{
常数res=[];
常数{length}=arr;
res[length]=0;
对于(设i=length-1;i>=0;i--){
res[i]=res[i+1]+arr[i];
}
返回res;
}
log(后缀([0,1,3,6,10])您可以这样做:

功能部件列表(ls)
{
让sumArr=[]
,lng=ls.长度
;
而(液化天然气>=0)
{
sumArr.推力(负载减少((acc,cur)=>acc+cur,0))
ls.shift()
--液化天然气
}
返回苏马尔
}
log(JSON.stringify(partsSums([0,1,3,6,10]))
。作为控制台包装{max height:100%!important;top:0;}
您可以这样做:

功能部件列表(ls)
{
让sumArr=[]
,lng=ls.长度
;
而(液化天然气>=0)
{
sumArr.推力(负载减少((acc,cur)=>acc+cur,0))
ls.shift()
--液化天然气
}
返回苏马尔
}
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()
后测试长度,然后中断循环

功能部件列表(ls){
设sumArr=[];
while(true){
sumArr.push(ls.reduce((acc,cur)=>acc+cur,0));
如果(ls.length==0){
打破
}
ls.shift();
}
返回苏马尔;
}

log(partssum([0,1,3,6,10])如注释中所述,您将得到一个无限循环,因为数组的长度永远不会低于
0

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

不要在
while()
条件下测试长度,而是在调用
reduce()
后测试长度,然后中断循环

功能部件列表(ls){
设sumArr=[];
while(true){
sumArr.push(ls.reduce((acc,cur)=>acc+cur,0));
如果(ls.length==0){
打破
}
ls.shift();
}
返回苏马尔;
}

log(partssum([0,1,3,6,10])
ls.length>=0更改为
ls.length>0
。while循环的条件永远不会计算为false,因为数组的长度永远不会低于0,因此您有一个无限循环。您要查找的输出是什么?我想在ls数组中没有剩余元素时将0推入我的sumArr中,我将调用reduce()fn。如果我将ls.length设置为>0,那么它将在最后一个元素之后停止。我可以在reduce()fn之后推0,但是在reduce函数中有什么方法可以这样做吗?我要寻找的输出是:[20,20,19,16,10,0]@链接,您可以在while-loop之后添加
sumArr.push(0)
。将
ls.length>=0
更改为
ls.length>0
。while循环的条件永远不会计算为false,因为数组的长度永远不会低于0,因此您有一个无限循环。您要查找的输出是什么?我想在ls数组中没有剩余元素时将0推入我的sumArr中,我将调用reduce()fn。如果我将ls.length设置为>0,那么它将在最后一个元素之后停止。我可以在reduce()fn之后推0,但是在reduce函数中有什么方法可以这样做吗?我要找的输出是:[20,20,19,16,10,0]@链接你可以在while-loop之后添加
sumArr.push(0)
。谢谢你的回答,但我只是想学习如何使用Array.prototype.reduce()fn。你的意思是说我的网页崩溃是因为我的功能不符合成本效益吗?不是!您的问题的解决方案在评论部分。这只是因为
ls.length>=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]);