2016-09-22 7 views
0

私は8ビットのバイナリを取り、合計を与える関数を作成しようとしています。JavaScript binary reduce関数:なぜ16 + 0は0を返しますか?

すべてのことのうち、num + numを実行することに問題があります。私軽減機能で

、私は合計を作成し、一緒にバイナリに変換さ数の値を追加します。私は二進数の配列の最初の1に到達したとき

const enumerableBinaryMap = { 
    0: 128, 
    1: 64, 
    2: 32, 
    3: 16, 
    4: 8, 
    5: 4, 
    6: 2, 
    7: 1 
}; 

function sum (arr) { 
    return arr.reduce((sum, val, index) => { 
     return sum + val === 1 ? enumerableBinaryMap[index] : 0; 
    }, 0); 
} 

sum([0, 0, 0, 1, 0, 0, 0, 1]); // 1, should be 17 

問題が発生します。

  1. 和= 0、valは= 0、インデックス= 0
  2. 和= 0、ヴァル= 0、インデックス:

    例えば、減速の各呼び出し上の値で下を見て= 1つの

  3. 和= 0、ヴァル= 0、インデックス= 2
  4. 和= 0、ヴァル= 1、インデックス= 3
  5. 和= 16、ヴァル= 0、インデックス= 4
  6. 和= 0 、val = 0、index = 5 < ---ブーム!

上記のように、レデューサーの5番目の呼び出しの戻り値は、ここでの原因です。 6回目のコールで合計が0になるのはなぜですか?私たちは16 + 0を返したので、まだ16になるはずですか?

および以下が動作するため、私は、削減の作品の私の実装を確認することができ、そしてそれは、基本的に私がやっても同じことだ:

[1, 2, 3, 4, 5].reduce((sum, val) => sum + val, 0); /// 15 

誰もが何が起こっているのか知っていますか?

+0

を使用するように括弧のカップルを追加します。 'reduce'の中に返されるもの – 4castle

+0

はい、それは動作しますが、なぜそれが必要ですか?私の質問の終わりに示した例では、 'sum' +任意の数値を返すだけでも戻り値にそれが加えられるので、この場合でも問題はありません。 – Lansana

+0

reduceは 'return sum +(val === 1 enumerableBinaryMap [index]:0);' – 4castle

答えて

2

operator precedenceの問題ですか?あなたは

return (sum + ((val === 1) ? enumerableBinaryMap[index] : 0)); 
//   ^          ^

をしたいのに対し、あなたが示したコードは

return (((sum + val) === 1) ? enumerableBinaryMap[index] : 0); 

として解釈され、それを修正するか、あなたが `sum`を追加する必要が

return val === 1 ? sum + enumerableBinaryMap[index] : sum; 
+0

解決に感謝します。 JavaScriptの連想性についてもっと勉強する必要があります。 – Lansana

関連する問題