我想創建一個函數,它需要8位二進制數並給你總和。JavaScript二進制減少函數:爲什麼16 + 0返回0?
我在做所有事情時都遇到了問題num + num
。
在我減少功能,我創建了一個總和加起來翻譯成二進制數的值:
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
- 總和= 0,VAL = 0,索引= 1
- 總和= 0,VAL = 0,索引= 2
- 總和= 0,VAL = 1,索引= 3
- 總和= 16,VAL = 0,索引= 4
- 總和= 0 ,val = 0,索引= 5 < ---嘭!
正如你在上面看到的,第五次調用在reducer中的返回值是這裏的罪魁禍首。爲什麼在第六次通話中總和等於0?它應該仍然是16,因爲我們返回了16 + 0?
而且我可以確認我的實現降低作品,因爲下面的下面的作品,它本質上是我在做同樣的事情:
[1, 2, 3, 4, 5].reduce((sum, val) => sum + val, 0); /// 15
任何人都知道這是怎麼回事?
您需要添加'sum'到「reduce」內部返回的內容。 – 4castle
是的,這有效,但它爲什麼有必要?我在我的問題結尾處展示的例子表明,只是返回'sum' +一些任意數字仍然會將其添加到返回值中,所以在這種情況下也不應該擔心。 – Lansana
減少應該是'return sum +(val === 1?enumerableBinaryMap [index]:0);' – 4castle