2017-02-24 19 views
0

数字が素数かどうかをチェックする関数を作ったのですが、そうでない場合は数値を返し、そうでない場合(素数の場合)は0を返します。JavaScriptのreduceメソッドの予期せぬ結果

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を非素数に誤って計算したかどうかをチェックする - それは0を返すので、誤算しません。

なぜ70の代わりに75の和を与えるのですか?

+2

reduceコールでは、 'total'の初期値である2番目のパラメータを指定します。これは' 0'になります。そうでなければ、 '5'の配列の最初の数字になります。 5 'で答えます。参照:https://jsfiddle.net/88gx55tm/ – tymeJV

答えて

5

reduceには常に初期値を含める必要があります。

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

ない初期値が含まれていないので、5は常に合計に含まれている場合totalための最初の値は、配列の最初の要素あります。

0

次の機能は機能し、よりクリーンです。命名規則は、関数名isSomethingがブール値を返すことを示唆していることに注意してください。 (私はノードでこれをテストしたので、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が彼の答えで指摘するように、あなたの低下は、あなたが.reduce()に2番目の引数として初期値(0)を供給すべきであるとして、実際に問題です。それ以外の場合、配列の最初の値は最初のtotalの値と見なされます。

関連する問題