【问题标题】:JavaScript binary reduce function: why is 16 + 0 returning 0?JavaScript二进制reduce函数:为什么16 + 0返回0?
【发布时间】: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 的值:

  1. sum = 0, val = 0, index = 0
  2. sum = 0, val = 0, index = 1
  3. sum = 0, val = 0, index = 2
  4. sum = 0, val = 1, index = 3
  5. sum = 16, val = 0, index = 4
  6. 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


【解决方案1】:

operator precedence的问题。您显示的代码被解释为

return (((sum + val) === 1) ? enumerableBinaryMap[index] : 0);

你想要的

return (sum + ((val === 1) ? enumerableBinaryMap[index] : 0));
//            ^                                            ^

添加一对括号来修复它或使用

return val === 1 ? sum + enumerableBinaryMap[index] : sum;

【讨论】:

  • 感谢您的解决方案。需要更多地研究 JavaScript 中的关联性。
猜你喜欢
  • 1970-01-01
  • 2023-02-11
  • 2012-08-09
  • 2019-12-15
  • 2022-01-23
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2015-06-21
相关资源
最近更新 更多