【发布时间】:2016-09-22 10:48:44
【问题描述】:
我正在尝试创建一个接收 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 的值:
- sum = 0, val = 0, index = 0
- sum = 0, val = 0, index = 1
- sum = 0, val = 0, index = 2
- sum = 0, val = 1, index = 3
- sum = 16, val = 0, index = 4
- sum = 0,val = 0,index = 5
如上所见,reducer 中第 5 次调用的返回值是这里的罪魁祸首。为什么第 6 次调用 sum 等于 0?它应该仍然是 16,因为我们返回了 16 + 0?
我可以验证我的 reduce 实现是否有效,因为以下内容有效,而且我正在做的事情基本上是一样的:
[1, 2, 3, 4, 5].reduce((sum, val) => sum + val, 0); /// 15
有人知道怎么回事吗?
【问题讨论】:
-
您需要将
sum添加到reduce中返回的内容中。 -
是的,这行得通,但为什么有必要呢?我在问题末尾展示的示例表明,仅返回
sum+ 某个任意数字仍会将其添加到返回值中,因此在这种情况下也无关紧要。 -
reduce 应该是
return sum + (val === 1 ? enumerableBinaryMap[index] : 0); -
嗯,好吧,所以问题一定是关联性。谢谢!
标签: javascript binary ecmascript-6