Странное поведение Array.reduce () с отрицанием и суммой - PullRequest
0 голосов
/ 26 апреля 2019

Данные:

arr = [0, 0, 0, 1, 1]

Код:

1

!arr[0] + !arr[1] + !arr[2] + !arr[3] + !arr[4]
// 3, correct!

но ...

2

arr.reduce((a, b) => (!a + !b));
// 1, bullshit?!

Вопрос: Почему 1 2 .не то же самое?Не имеет смысла для меня?Как я могу уменьшить () мой массив, чтобы дать мне так же, как в 1 .


Обновление:

arr = [{test: 0}, {test: 0}, {test: 0}, {test: 1}, {test: 1}]

try1: (почему это не работает?)

arr.reduce((a, b) => a.test + !b.test, {test: 0});
// NaN

arr.reduce((a, b) => a.test + !b.test, 0);
//NaN

1 Ответ

2 голосов
/ 26 апреля 2019

Вы отрицаете предыдущую сумму на каждой итерации, поэтому она будет обрабатываться как 1 (true) или 0 (false).

Это работает как:

+-------------+-------------+--------------+-----------------------------+
|  callback   | accumulator | currentValue |        return value         |
+-------------+-------------+--------------+-----------------------------+
| first call  |           0 |            0 | !0 + !0 = true + true = 2   |
| second call |           2 |            0 | !2 + !0 = false + true = 1  |
| third call  |           1 |            1 | !1 + !1 = false + false = 0 |
| fourth call |           0 |            1 | !0 + !1 = true + false = 1  |
+-------------+-------------+--------------+-----------------------------+

Итак, установите начальное значение с помощью метода Array#reduce, отмените следующее значение и добавьте предыдущую сумму.

arr.reduce((a, b) => a + !b, 0);

const arr = [0, 0, 0, 1, 1]

console.log(arr.reduce((a, b) => a + !b, 0));

Прямо сейчас это будет работать как:

+-------------+-------------+--------------+------------------------+
|  callback   | accumulator | currentValue |      return value      |
+-------------+-------------+--------------+------------------------+
| first call  |           0 |            0 | 0 + !0 = 0 + true = 1  |
| second call |           1 |            0 | 1 + !0 = 1 + true = 2  |
| third call  |           2 |            0 | 2 + !0 = 2 + true = 3  |
| fourth call |           3 |            1 | 3 + !1 = 3 + false = 3 |
| fifth call  |           3 |            1 | 3 + !1 = 3 + flase = 3 |
+-------------+-------------+--------------+------------------------+

ОБНОВЛЕНИЕ: Для вложенного объекта это будет выглядеть так:

arr.reduce((a, b) => a + !b.test, 0);
...