【发布时间】:2019-11-06 10:04:45
【问题描述】:
试图解决this challenge on codewars。根据挑战,数组的部分:
ls = [0, 1, 3, 6, 10]
是
ls = [0, 1, 3, 6, 10]
ls = [1, 3, 6, 10]
ls = [3, 6, 10]
ls = [6, 10]
ls = [10]
ls = []
我们需要返回一个包含这些部分总和的数组。
所以我的代码如下:
function partsSums(ls) {
let arrayOfSums = [];
while(ls.length > 0) {
let sum = ls.reduce((a, b) => a + b);
arrayOfSums.push(sum);
ls.shift();
}
return arrayOfSums;
}
console.log(partsSums([0, 1, 3, 6, 10]));
问题是它希望我们在数组为空时添加最后一个总和 0。所以我们应该得到:
[ 20, 20, 19, 16, 10, 0 ]
代替
[20、20、19、16、10]
所以我尝试了这个:
function partsSums(ls) {
let arrayOfSums = [];
while(ls.length > 0) {
let sum = ls.reduce((a, b) => a + b);
arrayOfSums.push(sum);
ls.shift();
}
arrayOfSums.push(0);
return arrayOfSums;
}
console.log(partsSums([0, 1, 3, 6, 10]));
还有这个:
function partsSums(ls) {
ls.push(0);
let arrayOfSums = [];
while(ls.length > 0) {
let sum = ls.reduce((a, b) => a + b);
arrayOfSums.push(sum);
ls.shift();
}
return arrayOfSums;
}
但是这些导致 Codewars 上的执行超时错误:
执行超时(12000 毫秒)
所以我也试过了:
function partsSums(ls) {
let arrayOfSums = [];
while(ls.length > -1) {
let sum = ls.reduce((a, b) => a + b);
arrayOfSums.push(sum);
ls.shift();
}
return arrayOfSums;
}
但现在这会导致 TypeError:
TypeError: 减少没有初始值的空数组
当所有值都移出时,我不理解如何将 0 放入数组的概念。挑战似乎希望 0 作为数组的最终“总和”,即使数组为空。但是你不能减少一个空数组——我还能在这里做什么?
编辑:尝试向 reduce 方法添加初始值:
function partsSums(ls) {
let arrayOfSums = [];
while(ls.length > 0) {
let sum = ls.reduce((a, b) => a + b, 0);
arrayOfSums.push(sum);
ls.shift();
}
return arrayOfSums;
}
不幸的是,这仍然未能通过基本测试:
预期 [] 深度等于 [0]
【问题讨论】:
-
我已经尝试自己解决了。我不知道还能尝试什么。我不理解如何将空数组的总和添加到最终数组的概念。因为您不能在空数组上使用 reduce。还有其他想法吗?
-
你不能在循环后按 0 吗?
-
这个:但你不能减少一个空数组 - 那不是那个错误消息(TypeError:减少没有初始值的空数组 ) 说。其实很具体:请重新阅读reduce的文档:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - 然后重新阅读错误信息。
-
@RandyCasburn “如果没有提供初始值,将使用数组中的第一个元素。在没有初始值的空数组上调用 reduce() 将引发类型错误。”所以也许 reduce 并不是求数组总和的最佳方法。
-
宾果游戏!但也要考虑迭代器点。
标签: javascript arrays sum reduce