私は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
問題が発生します。
- 和= 0、valは= 0、インデックス= 0
- 和= 0、ヴァル= 0、インデックス:
例えば、減速の各呼び出し上の値で下を見て= 1つの
- 和= 0、ヴァル= 0、インデックス= 2
- 和= 0、ヴァル= 1、インデックス= 3
- 和= 16、ヴァル= 0、インデックス= 4
- 和= 0 、val = 0、index = 5 < ---ブーム!
上記のように、レデューサーの5番目の呼び出しの戻り値は、ここでの原因です。 6回目のコールで合計が0になるのはなぜですか?私たちは16 + 0を返したので、まだ16になるはずですか?
および以下が動作するため、私は、削減の作品の私の実装を確認することができ、そしてそれは、基本的に私がやっても同じことだ:
[1, 2, 3, 4, 5].reduce((sum, val) => sum + val, 0); /// 15
誰もが何が起こっているのか知っていますか?
を使用するように括弧のカップルを追加します。 'reduce'の中に返されるもの – 4castle
はい、それは動作しますが、なぜそれが必要ですか?私の質問の終わりに示した例では、 'sum' +任意の数値を返すだけでも戻り値にそれが加えられるので、この場合でも問題はありません。 – Lansana
reduceは 'return sum +(val === 1 enumerableBinaryMap [index]:0);' – 4castle