JavaScript中reduce方法的意外结果

JavaScript中reduce方法的意外结果,javascript,reduce,Javascript,Reduce,我做了一个函数来检查一个数字是否是素数,如果不是,则返回该数字,否则(如果是素数)返回0 var maybePrimeNumber = [5, 8, 11, 14, 17, 20, 23, 28, 31]; //numbers to test function isNotPrime(integer){ var prime = true; //start off assuming that it is a prime nr for now var retur

我做了一个函数来检查一个数字是否是素数,如果不是,则返回该数字,否则(如果是素数)返回0

var maybePrimeNumber = [5, 8, 11, 14, 17, 20, 23, 28, 31]; //numbers to test

function isNotPrime(integer){
    var prime = true;            //start off assuming that it is a prime nr for now
    var returnNumber = 0;        //to be returned at the end

    for(i = 2; i<integer; i++){  //go from 2 up to the number,
        if(integer % i === 0){   //if the number is divisible by any nr between 2 and itself, 
            prime = false;       //then say that it isn't a prime number
        }
    }

    if(!prime){                  //if it isn't a prime number, then
        returnNumber = integer;  //prepare to send back the number
    }

    return returnNumber;
}

document.getElementById("demo").innerHTML = maybePrimeNumber.reduce(
    (total, integer) => {return total + isNotPrime(integer)}
); 
//sum all non-prime numbers up from the array and put the sum into the paragraph "demo"
为了检查它是否错误地将5计算为非素数,它返回0,这样就不会计算错误


为什么它给出的总和是75而不是70???

您应该始终为
reduce
包含一个初始值

document.getElementById("demo").innerHTML = maybePrimeNumber
  .reduce((total, integer) => {return total + isNotPrime(integer)}, 0);

total
的第一个值是数组的第一个元素,如果没有包含初始值,那么
5
总是包含在总和中。

您应该始终包含
reduce
的初始值

document.getElementById("demo").innerHTML = maybePrimeNumber
  .reduce((total, integer) => {return total + isNotPrime(integer)}, 0);

如果不包含初始值,则
total
的第一个值是数组的第一个元素,因此
5
始终包含在总和中。

以下函数起作用并且更干净。请注意,命名约定将建议函数名
isSomething
返回布尔值。(注意,我使用了console.log,因为我在节点中测试了它)

const-maybeiprimenumber=[5,8,11,14,17,20,23,28,31]//要测试的数字
函数isNotPrime(整数){
对于(i=2;itotal+(isNotPrime(integer)?integer:0),0));

正如@Xufox在他的回答中指出的,您的缩减实际上是一个问题,因为您应该提供一个初始值(0)作为
.reduce()
;的第二个参数;否则,数组中的第一个值将被视为初始
总值。

以下函数工作正常且更干净。请注意,命名约定将建议函数名
isSomething
返回布尔值。(注意,我使用了console.log,因为我在节点中测试了它)

const-maybeiprimenumber=[5,8,11,14,17,20,23,28,31]//要测试的数字
函数isNotPrime(整数){
对于(i=2;itotal+(isNotPrime(integer)?integer:0),0));

正如@Xufox在他的回答中指出的,您的缩减实际上是一个问题,因为您应该提供一个初始值(0)作为
.reduce()
;的第二个参数;否则,数组中的第一个值将被视为初始
total
值。

在reduce调用中,指定第二个参数,即
total
-的初始值为
0
-否则它将是数组中的第一个数字,即
5
,因此您的
5
关闭应答。请参阅:在reduce调用中,指定第二个参数,即
total
-的初始值为
0
-否则它将是数组中的第一个数字,即
5
,因此您的
5
关闭回答。见: