实际应用中,树形结构数据存在数据量大或者结构复杂时,会有搜索功能的需求。输入内容实时过滤数据并渲染,还需要保留树形结构,根据搜索内容保留父节点数据。一开始思路不开阔,想逐层遍历 ,保留各层级内容。但是细想这种方式不够实用,也不灵活,不具备复用功能,也不是一个成熟程序员该用的正确方式。因此开阔思路后,最终实现了需要的功能,并且实用。
1、整体一个过滤方法,接受两个参数,一个树数据,一个方法(该方法通过搜索输入的内容进行节点匹配)。
2、过滤方法中,需要先用map复制一下数据,避免修改到原始的树数据
具体实现如下:
(1)、// 监听input事件,输入和改变
$('#searchMenu').on('input change', function(){
// 判断是否是谷歌浏览器
if(!inputFocus){
let newMenus = treeFilter(menuList, filterNode);
drawMenu(newMenus);
inputFilter = true;
}
})
(2)、
// 过滤方法
function treeFilter (tree, func) {
// 使用map复制一下节点,避免修改到原树
return tree.map(node => ({ ...node })).filter(node => {
node.childMenus = node.childMenus && treeFilter(node.childMenus, func)
return func(node) || (node.childMenus && node.childMenus.length)
})
}
/**
* 对树节点进行筛选
*/
function filterNode(node) {
let text = $('#searchMenu').val();
if (!text) return true;
return node['text'].indexOf(text) !== -1;
}