Вы отрицаете предыдущую сумму на каждой итерации, поэтому она будет обрабатываться как 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);