Проблема в том, что вы изменяете массив, так как reduce
перебирает его. Это меняет массив под ним, поэтому операция не совпадает с c базовыми значениями. Вот (несколько небрежно) иллюстрация того, как 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, а длина = 1 имеет только индекс = 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 = function (head) {
let total = head.reduce(
(sum, item, index, array) =>
sum + item * Math.pow(2, (array.length - index - 1)),
// reverse index ^^^^^^^^^^^^^^^^^^^^^^^^
0
)
return total
}
console.log(getDecimalValue([1, 0, 1]) == 5)
console.log(getDecimalValue([1, 1, 1, 0, 0, 1]) == 57)
console.log(getDecimalValue([1, 1, 1, 0, 0, 1, 1]) == 115)
console.log(getDecimalValue([0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0]) == 7392)
console.log(getDecimalValue([1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0]) == 18880)