我正在尝试创建一个接收8位二进制的函数,并为您提供总和。
我在执行num + num
方面遇到了麻烦。
在我的reduce函数中,我创建了一个总和,并将二进制数字的值加起来:
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时,会出现问题。
例如,请看下面每个reducer调用的值:
正如您在上面所看到的,减速器中第5次调用的返回值是这里的罪魁祸首。为什么总和在第6次呼叫时等于0?它应该仍然是16因为我们返回16 + 0?
我可以验证我的reduce工作的实现,因为下面的代码可以工作,而且它与我正在做的事情基本相同:
[1, 2, 3, 4, 5].reduce((sum, val) => sum + val, 0); /// 15
任何人都知道发生了什么事?
答案 0 :(得分:2)
问题是operator precedence。您显示的代码被解释为
return (((sum + val) === 1) ? enumerableBinaryMap[index] : 0);
而你想要
return (sum + ((val === 1) ? enumerableBinaryMap[index] : 0));
// ^ ^
添加几个括号来修复它或使用
return val === 1 ? sum + enumerableBinaryMap[index] : sum;