Что касается методов массива JS без lodash, то filter() мне больше всего нравится, поскольку он дает вам ссылку на элемент массива, что позволяет выполнять над ним мутации. MDN Doc для метода подробно перечисляет несколько полезных хаков, которыми метод может оборудовать ваш код. Однако при неосторожном использовании может привести к популярной ловушке в отношении вложенных массивов.

Ходи в моей обуви 🚶

У меня был массив объектов, которые я фильтровал, чтобы найти элементы, обладающие определенным свойством.

> [{a: "alpha", b: "bravo"},{a: "ammataudu"}].filter(el => el.b)

Отлично работает. Находит мне тот со свойством «b» в объекте. Переходим к погоне › Через несколько спринтов кому-то пришла в голову блестящая идея создать метаобъект и сложить приведенные выше данные в метаобъект, чтобы решить другую проблему. Реальность мира. Вы должны играть вместе со всеми. На заметку › Теперь мой массив алфавитов разделен и сложен внутри внешнего массива.

Array.prototype.filter() дает вам ссылку на объект в массиве для массива объектов. это было основной причиной, по которой я решил использовать его, поскольку мне нужно было изменить входящую полезную нагрузку. (Худший поступок, но этого требовала ситуация)

Теперь в том же духе, если бы я попытался отфильтровать метаобъект, который имеет мой объект алфавита со свойством «b», используя 👇

> meta.filter(arr => arr.alphabet.filter(el => el.b))

Вы получите оба метаобъекта обратно.

Первый объект имеет свойство b и возвращает true, поэтому добавляется в результирующий массив. Второй объект, с другой стороны, не имеет причин квалифицироваться, но все же делает это.

Почему 🤔

Причина этого скрыта в самом низу документации по ссылке выше. В контексте внутреннего массива «алфавит» фильтр пропускает каждый элемент через el => el.b, чтобы определить, является ли он квалификатором.

el.b оценивается как [{ a: ‘альфа’, b: ‘браво’}] при работе с первым массивом alphabet.

el.b оценивается как [] при работе со вторым массивом alphabet.

В методе фильтра внешнего массива эти две функции оцениваются как истинные при передаче по строкам 14–16 здесь. Сделать оба элемента метамассива подходящими для окончательного результирующего массива. Это пробное объяснение поведения, оспариваемого выше.

Заменив внутренний вызов filter методами some или find Array.prototype, можно добиться желаемого результата.

Проще говоря,
> [[],[1]].filter(arr => arr.filter(el => el > 0))
будет оцениваться как: [[],[1]]
Однако
> [[],[1]].filter(arr => arr.some(el => el > 0))
будет оцениваться как: [[1]]