廢話不說直接上代碼,
參考博文https://segmentfault.com/q/1010000018197249/a-1020000018203261
/// <summary>
/// 過濾樹形結構數據
/// </summary>
/// <param name="nodes">樹形節點數據要求是數組類型</param>
/// <param name="childrenName">child的fieldName</param>
/// <param name="predicate">過濾方法</param>
function filterTreeData(nodes, childrenName, predicate) {
// 如果已經沒有節點了,結束遞歸
if (!(nodes && nodes.length)) {
return [];
}
const newChildren = [];
for (const node of nodes) {
if (predicate(node)) {
// 如果節點符合條件,直接加入新的節點集
newChildren.push(node);
node[childrenName] = filterTreeData(node[childrenName], childrenName, predicate);
} else {
// 如果當前節點不符合條件,遞歸過濾子節點,
// 把符合條件的子節點提升上來,併入新節點集
newChildren.push(...filterTreeData(node[childrenName], childrenName, predicate));
}
}
return newChildren;
}