[英]Javascript Recursive Function doesn't work for arranging data
當我運行這段代碼時,出於某種原因,我認為遞歸的range方法沒有做正確的事。 過濾器功能的輸出中沒有任何內部分組。 功能性JavaScript我在做什么錯?
const def = x => typeof x !== 'undefined' const filter = ([x, ...xs], fn) => def(x) ? fn(x) ? [x, ...filter(xs, fn)] : [...filter(xs, fn)] : [] let arrange = t => { return { num: t.id, groups: t.groups.map(arrange) } } let data = [ {id: 1, groups: [{id: 3, groups: []}]}, {id: 4, groups: []}, {id: 5, groups: []} ] let groups = data.map(arrange) console.log(groups) // => [ { num: 1, groups: [ [Object] ] }, // { num: 4, groups: [] }, // { num: 5, groups: [] } ] let getById = g => { if (g.num === 3) { return true } else { return false } } let filtered = filter(groups, getById) console.log(filtered) // []
在過濾之前,您必須將嵌套條目展平到展平列表中:
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
是非常新的,因此您可能不希望在沒有編譯器的情況下在生產中使用它...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.