当我运行这段代码时,由于某种原因,我认为递归安排方法做的不正确。过滤器功能的输出中没有任何内部分组。功能性javascript怎么了?
id type Dates
--------------------
1 In 2018-10-01
1 In 2018-11-01
1 Out 2018-12-01
2 In 2018-10-01
2 In 2018-12-01
2 Out 2018-11-01
答案 0 :(得分:1)
在过滤之前,您必须将嵌套条目展平到展平列表中:
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
非常新,因此您可能不希望在没有编译器的情况下在生产中使用它。