我想创建一个函数,它需要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