簡體   English   中英

Javascript遞歸函數不適用於排列數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM