Javascript 使用array.reduce方法将二进制数字数组转换为十进制

Javascript 使用array.reduce方法将二进制数字数组转换为十进制,javascript,arrays,binary,reduce,Javascript,Arrays,Binary,Reduce,我试图在表示单个二进制值的数组上使用array.reduce。例如,二进制的[1,0,1]将转换为十进制的5 我已经能够使用while循环成功地在二进制和十进制之间转换,但是我想升级我的代码以使用reduce方法 到目前为止,我实现的是数组中最多6个元素的精确值。我不知道为什么,但是经过6次挖掘,转换失败了 此外,我正在使用公式进行转换。例如:要将111001转换为十进制,您必须执行(1*2^5)+(1*2^4)(1*2^3)+(0*2^2)+(0*2^1)+(1*2^0) const get

我试图在表示单个二进制值的数组上使用array.reduce。例如,二进制的[1,0,1]将转换为十进制的5

我已经能够使用while循环成功地在二进制和十进制之间转换,但是我想升级我的代码以使用reduce方法

到目前为止,我实现的是数组中最多6个元素的精确值。我不知道为什么,但是经过6次挖掘,转换失败了

此外,我正在使用公式进行转换。例如:要将111001转换为十进制,您必须执行(1*2^5)+(1*2^4)(1*2^3)+(0*2^2)+(0*2^1)+(1*2^0)

const getDecimalValue=函数(head){
让总数=头减少(
(总和)=>
总和+(head.shift()*数学功率(2,head.length))
)
返回总数
}
log(getDecimalValue([1,0,1])==5)
log(getDecimalValue([1,1,1,0,0,1])==57)
log(getDecimalValue([1,1,1,0,0,1,1])==115)
log(getDecimalValue([0,1,1,1,0,0,1,1,1,0,0,0])==7392)

log(getDecimalValue([1,0,0,1,0,0,1,1,1,0,0,0,0])==18880)
您可以减少数组并乘以最后一个值,然后添加实际值

const getDecimalValue=array=>array.reduce((r,v)=>r*2+v,0);
log(getDecimalValue([1,0,1])==5)
log(getDecimalValue([1,1,1,0,0,1])==57)
log(getDecimalValue([1,1,1,0,0,1,1])==115)
log(getDecimalValue([0,1,1,1,0,0,1,1,1,0,0,0])==7392)

log(getDecimalValue([1,0,0,1,0,0,0,1,1,1,0,0,0,0])==18880)
问题在于,当
reduce
对数组进行迭代时,您正在对数组进行变异。这会更改下面的数组,因此操作与基础值不同步。以下是
reduce
如何正常运行阵列的(有些松散)说明:

arr =       [1, 2, 3]
             ^  ^  ^
             |  |  |
iteration 1 --  |  |
iteration 2 -----  |
iteration 3 --------        
以下是每次迭代修改时发生的情况:

//start
arr =       [1, 2, 3]

//at iteration 1
            [2, 3] _
             ^
             |
iteration 1 --

//at iteration 2
            [3] _ _
                ^
                |
iteration 2 -----

//at iteration 3
            [] _ _
                 ^
                 |
iteration 3 ------        
取而代之的是,获取功能的直接方法是将每个项设置为2的幂,该幂等于该项的反向索引

//index:            0   1   2   3
arr =              [1,  0,  1,  0]
//reverse index:    3   2   1   0
为了方便起见,只需从数组长度中减去
1
(因为索引是基于0的,而length=1只有index=0),然后减去正常索引。这将为您提供两个值的幂,每个值表示:

//reverse index:    3   2   1   0
arr =              [1,  0,  1,  0]
//power of 2:       8   4   2   1
//multiply and sum: 8 + 0 + 2 + 0 = 10
下面是使用
reduce
的代码:

const getDecimalValue=函数(head){
让总数=头减少(
(总和、项目、索引、数组)=>
sum+item*Math.pow(2,(array.length-index-1)),
//反向索引^^^^^^^^^^^^^^^^^^^^^^^^
0
)
返回总数
}
log(getDecimalValue([1,0,1])==5)
log(getDecimalValue([1,1,1,0,0,1])==57)
log(getDecimalValue([1,1,1,0,0,1,1])==115)
log(getDecimalValue([0,1,1,1,0,0,1,1,1,0,0,0])==7392)

log(getDecimalValue([1,0,0,1,0,0,1,1,1,0,0,0,0])==18880)
在对数组进行迭代时正在对其进行变异。只是…不要这样做,因为在你转移了索引之后,你让整个操作都出错了。我希望这里提出的所有问题都能在范围上如此清晰,并且都有自己的测试+我为此付出了代价!谢谢,我非常接近你在我最初的尝试中提出的建议。我很欣赏这个清晰简洁的解释