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; },
该 效果为搜索树并形成新的树,来源于网上资料。