const result = this.deal(this.data.getWorkListArrOld, node => node.label.indexOf(e.detail.value)!=-1);
console.log(JSON.stringify(result, null, 4));
/**
* 递归过滤节点,生成新的树结构
* @param {Node[]} nodes 要过滤的节点
* @param {node => boolean} predicate 过滤条件,符合条件的节点保留
* @return 过滤后的节点
*/
deal(nodes, predicate) {
// 如果已经没有节点了,结束递归
if (!(nodes && nodes.length)) {
return;
}
const newChildren = [];
for (const node of nodes) {
if (predicate(node)) {
// 如果自己(节点)符合条件,直接加入到新的节点集
newChildren.push(node);
// 并接着处理其 children
node.children = this.deal(node.children, predicate);
} else {
// 如果自己不符合条件,需要根据子集来判断它是否将其加入新节点集
// 根据递归调用 deal() 的返回值来判断
const subs = this.deal(node.children, predicate);
// 以下两个条件任何一个成立,当前节点都应该加入到新子节点集中
// 1. 子孙节点中存在符合条件的,即 subs 数组中有值
// 2. 自己本身符合条件
if ((subs && subs.length) || predicate(node)) {
node.children = subs;
newChildren.push(node);
}
/* if (subs && subs.length) {
// 1. 如果子孙集中有符合要求的节点(返回 [...]),加入
node.children = subs;
newChildren.push(node);
} */
// 2. 否则,不加入(因为整个子集都没有符合条件的)
}
}
return newChildren.length ? newChildren : void 0;
},
该 效果为搜索树并形成新的树,来源于网上资料。
浙公网安备 33010602011771号