2016-09-22 78 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