我正在尝试编写一个函数,它接受数组作为输入。如果整数是正数,它会计数它。如果整数是负的,它就把它和起来。
我认为js中的reduce()
助手将是最好的方法,但在第一个参数运行时,我总是返回未定义的参数。
这是我的密码:
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‘记录到减缩函数内部的控制台时,除了第一个输入之外,它会记录所有未定义的输入。第一个,如预期的,是0。但对于每一个后续输入,它都会记录未定义的日志。为什么会发生这种情况?
提前谢谢。
发布于 2017-04-02 09:14:14
传递给.reduce()
的回调需要返回累积值(将作为prev
传递给循环的下一次迭代的值)。由于您不返回任何内容,所以您将获得循环的下一次迭代的undefined
。
这使您想要做的事情更加复杂,因为您试图跟踪循环中的两个值。因此,您要么必须完全避免使用prev
,要么就必须使它成为一个包含两个值的数据结构。您的使用不是.reduce()
的教科书示例。通过使用.forEach()
或for/of
进行迭代,您的代码可能更简单。
function countPositivesSumNegatives(input) {
let countPositive = 0;
let sumNegative = 0
if (!input || input.length === 0){
return [];
} else {
input.forEach(function(num){
if (num > 0) {
++countPositive;
} else {
sumNegative += num;
});
}
return [countPositive, sumNegative];
}
发布于 2017-04-02 09:40:28
很抱歉,但是这不是这个功能的一个很好的实现。但我们可以纠正您的功能如下;
function countPositivesSumNegatives(input) {
let countPositive = 0;
let sumNegative = 0;
if (input === null || input === []){
return [];
} else {
sumNegative = input.reduce(function(prev,num){
if (num > 0) {
countPositive++;
} else {
prev += num;
}
return prev; // <---- THE MISSING PART
}, 0);
}
return [countPositive, sumNegative];
}
var data = [1,2,3,4,5,-4,7,-3];
console.log(countPositivesSumNegatives(data));
然而,尽管代码工作得很好,但它仍然涉及许多问题。当进入像.reduce()
这样的函子时,你应该能够将所有的东西都保存在它的内部,而不应该在外部范围内引用变量。因此,您可以简单地将此代码重新表述如下;
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))
https://stackoverflow.com/questions/43171120
复制相似问题