Перед фильтрацией необходимо сгруппировать вложенные записи в плоский список:
const flatten = groups => groups.flatMap(group => [group, ...flatten(group.groups)]);
Таким образом, вы можете легко сделать это:
const result = filter(flatten(groups), byID);
, чтобы получить массив групп.
Чтобы сохранить древовидный порядок, вы должны были бы рекурсивно фильтровать:
const advancedFilter = predicate => array => array.map(predicate).filter(it => it.take).map(it => it.value || it);
const use = (a, v) => v(a);
const filterGroups = predicate => advancedFilter(group => use(
filterGroups(predicate)(group.groups),
filtered => ({ take: predicate(group) || !!filtered.length, value: { ...group, groups: filtered })
));
const result = filterGroups(byID)(groups);
Обратите внимание, что flatMap
очень нов, поэтому вы можете не использоватьэто в производстве без транспортера ...