JavaScript中reduce方法的意外结果

Jac*_*des 0 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 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"
Run Code Online (Sandbox Code Playgroud)

问题如下:

当我跑这个,它给了我75,但它应该给我70.

所以当我用这个替换最后一行时:

document.getElementById("demo").innerHTML = isNotPrime(maybePrimeNumber[0]);
Run Code Online (Sandbox Code Playgroud)

要检查它是否错误地将5计算为非素数 - 它返回0,因此它不会计算错误.

为什么它总和75而不是70呢?

Seb*_*mon 5

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

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

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