Насколько я правильно понял, интрепретатор спускается к строчке .filter((v) => v тогда, когда map свою работу выполнил. Грубо говоря, filter начинает работать с этим массивом: ‘[“a”, [null, null, [“d”, [null, [“j”]]]]]’
const newChildren = [“a”, [null, null, [“d”, [null, [“j”]]]].filter((v) => v)
return [name, newChildren];
};
Всё правильно вы поняли и данный массив состоит из двух компонентов
[“a”, [null, null, [“d”, [null, [“j”]]]]]
Где первый элемент массива это строка “a”
, второй элемент массива - это массив значений [null, null, [“d”, [null, [“j”]]]]
Из этого следует элементов в массиве 2 и ответ на ваш вопрос:
… И почему, функция filter отрабатывает всего 2 раза, а не по количеству элементов, как это и нужно было.
Теперь вернёмся к вопросу:
С этого момента становиться не понятно, что происходит, а именно. После попадание на строчку filter((v) => v) интрепретатор идёт вниз к return и после, возвращается обратно к filter. Почему так происходит? Ведь return, в данном случае, должен был прекратить работу функции?
Как Вы верно заметили с этого момента выполниться следующий код
['a', [null, null, ['d', [null, ['j']]]]].filter((v) => v)
Следуя спецификации метод filter
выполнит данный callback
(в нашем случаи callback
-ом является функция (v) => v
)) для каждого элемента массива (как помним их 2) и в случаи вызов callback
-а вернёт значение true
, элемент на котором сработал callback
будет добавлен в новый массив который возвращает данный метод.
Также следует отметить, что callback
, первый аргументом принимает элемент иттерируемого массива.
Рассмотрим вызов callback
а на каждом элементе данного массива:
[
'a', // Первый элемент массива
[null, null, ['d', [null, ['j']]]] // Второй элемент массива
].filter((v) => {
// Первый вызов v в данном случаи это 'a' и функция возвращает логическое true, так как в JS не пустая строка это true
// Второй вызов v - массива, что тоже в JS является логическим true
return v
})
// Поэтому результатом вызова filter будет новый массив, который в точности такой же как и обрабатываемый до вызова filter:
[
'a',
[null, null, ['d', [null, ['j']]]]
]