JavaScript 中 reduce 方法的意外结果

Unexpected result from reduce method in JavaScript

我做了一个函数来检查一个数是否是质数,如果不是,那么它 returns 这个数,否则(如果它是一个质数)它 returns 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"

问题如下:

当我运行这个的时候,它给了我75,但它应该给我70。

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

document.getElementById("demo").innerHTML = isNotPrime(maybePrimeNumber[0]);

检查它是否错误地将 5 计算为非质数 - 它 returns 0,所以它不会计算错误。

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

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

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

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

以下功能有效且更简洁。请注意,命名约定建议函数名称 isSomething returns 布尔值。 (注意我使用了 console.log 因为我在节点中测试过它)。

const maybePrimeNumber = [5, 8, 11, 14, 17, 20, 23, 28, 31]; //numbers to test
function isNotPrime(integer) {
  for(i = 2; i < integer / 2; i++){ //go from 2 up to the number,
    if(integer % i === 0){    //if the number is divisible by any nr between 2 and itself, 
      return true;          //then say that it isn't a prime number
    }
  }

  return false;
}

console.log(maybePrimeNumber.reduce((total, integer) => total + (isNotPrime(integer) ? integer : 0), 0));

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