Javascript递归函数不适用于排列数据

时间:2018-12-19 18:21:38

标签: javascript ecmascript-6 functional-programming

当我运行这段代码时,由于某种原因,我认为递归安排方法做的不正确。过滤器功能的输出中没有任何内部分组。功能性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

1 个答案:

答案 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非常新,因此您可能不希望在没有编译器的情况下在生产中使用它。