2016-09-22 82 views
0

我想创建一个函数,它需要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二进制数的阵列中出现问题。

例如,拿一个在值上的减速器的每个调用下面的样子:

  1. 总和= 0,VAL = 0,索引= 0
  2. 总和= 0,VAL = 0,索引= 1
  3. 总和= 0,VAL = 0,索引= 2
  4. 总和= 0,VAL = 1,索引= 3
  5. 总和= 16,VAL = 0,索引= 4
  6. 总和= 0 ,val = 0,索引= 5 < ---嘭!

正如你在上面看到的,第五次调用在reducer中的返回值是这里的罪魁祸首。为什么在第六次通话中总和等于0?它应该仍然是16,因为我们返回了16 + 0?

而且我可以确认我的实现降低作品,因为下面的下面的作品,它本质上是我在做同样的事情:

[1, 2, 3, 4, 5].reduce((sum, val) => sum + val, 0); /// 15 

任何人都知道这是怎么回事?

+0

您需要添加'sum'到“reduce”内部返回的内容。 – 4castle

+0

是的,这有效,但它为什么有必要?我在我的问题结尾处展示的例子表明,只是返回'sum' +一些任意数字仍然会将其添加到返回值中,所以在这种情况下也不应该担心。 – Lansana

+0

减少应该是'return sum +(val === 1?enumerableBinaryMap [index]:0);' – 4castle

回答

2

operator precedence的问题。还有你的代码被解释为

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

,而你想

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

添加一对夫妇括号来修复它,或者使用

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

感谢您的解决方案。需要研究JavaScript中的关联性。 – Lansana