@fe6/water-pro
Version:
An enterprise-class UI design language and Vue-based implementation
28 lines (26 loc) • 653 B
text/typescript
function arrayTreeFilter<T>(
data: T[],
filterFn: (item: T, level: number) => boolean,
options?: {
childrenKeyName?: string;
},
) {
options = options || {};
options.childrenKeyName = options.childrenKeyName || 'children';
let children = data || [];
const result: T[] = [];
let level = 0;
do {
const foundItem: T = children.filter((item) => {
return filterFn(item, level);
})[0];
if (!foundItem) {
break;
}
result.push(foundItem);
children = (foundItem as any)[options.childrenKeyName] || [];
level += 1;
} while (children.length > 0);
return result;
}
export default arrayTreeFilter;