我正在尝试编写一个以数组作为输入的函数。如果整数是正数,则计算它。如果整数是负数,则将其相加。
我认为js中的reduce()
帮助器是最好的解决方法,但是当它运行时我继续为我的第一个参数返回undefined。
这是我的代码:
function countPositivesSumNegatives(input) {
let countPositive = 0;
let sumNegative = 0
if (input === null || input === []){
return [];
} else {
return input.reduce(function(prev,num){
if (num > 0) {
countPositive++;
}else{
sumNegative = prev + num};
}, 0);
}
return [countPositive, sumNegative];
}
它抛出了一个TypeError,上面写着:
TypeError:无法读取未定义的属性“0”
当我将'prev'记录到reduce函数内的控制台时,它会为除第一个输入之外的所有输入记录undefined。正如预期的那样,第一个是0.但是对于每个后续输入,它都会记录未定义。为什么会这样?
提前致谢。
答案 0 :(得分:4)
传递给.reduce()
的回调需要返回累积值(将作为prev
传递给循环的下一次迭代的值。由于你什么也没有返回,你得到{{ 1}}用于循环的下一次迭代。
这使您尝试执行的操作变得复杂,因为您试图在循环中跟踪两个值。因此,您要么必须完全避免使用undefined
,要么必须使其成为一个包含您的值的数据结构。您的使用不是prev
的教科书示例。使用.reduce()
或.forEach()
进行迭代时,您的代码可能更简单。
for/of
答案 1 :(得分:0)
很抱歉,这不是一个很好的实现这个功能。但我们可以按照以下方式更正您的功能;
var data = [1,2,3,4,5,-4,7,-3],
cpsn = a => a.reduce((p,c) => c > 0 ? (p[0]++,p) : (p[1]+=c,p) ,[0,0]);
console.log(cpsn(data))
然而,虽然代码工作正常,但它仍然涉及许多问题。当进入像numprocs=8
这样的仿函数时,你应该能够保持其自身的内涵,而不应该引用外部范围的变量。因此,可以简单地将此代码改写如下;
numprocs=1