// nodes就是树形的最原始数据,query就是关键字,最后会返回满足条件的节点数组
function filter(nodes, query) {
// 判断当前节点是否包含关键字,包含则返回true,不包含则返回false
let predicate = function (node) {
if (node.title.indexOf(query) > -1) {
return true;
} else {
return false;
}
};
if (!(nodes && nodes.length)) {
return [];
}
let newChildren = [];
for (let node of nodes) {
// 以下两个条件任何一个成立,当前节点都应该加入到新子节点集中
// 1. 子孙节点中存在符合条件的,即 subs 数组中有值
// 2. 自己本身符合条件
let subs = this.filter(node.children, query);
//递归遍历最深的那个节点,拿到那个节点的子节点数组
if (predicate(node)) {
如果当前节点包含关键字,push存起来,且他的子节点数组为空,就设置当前节点数组为空
newChildren.push(node);
if (!subs.length) {
node.childNodes = subs;
}
} else if (subs && subs.length) {
node.children = subs;
newChildren.push(node);
}
// 以下只需要考虑自身的节点满足条件即可,不用带上父节点
if (predicate(node)) {
newChildren.push(node);
node.children = this.filter(node.children, query);
} else {
newChildren.push(...this.filter(node.children, query));
}
}
return newChildren.length ? newChildren : [];
}
过滤树形结构数据
最新推荐文章于 2024-03-27 18:01:52 发布