问题描述
只要我不传递初始值,网页就可以正常工作,但是在那种情况下,它只会给我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]
解决方法
您的代码存在问题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]));