当前位置: 首页 > Web前端 > JavaScript

使用js中的filter函数过滤树数据

时间:2023-03-26 23:33:07 JavaScript

1、场景中有一个树形数据,想根据每个节点的disabled进行过滤,得到一个新的过滤后的树形数据。2.普通数组(抛砖引玉)如果只是数组,要知道我们可以用js过滤例如:vararr=[{name:'小明',disabled:true},{name:'小白',disabled:false},{name:'小黑',disabled:true},]varnewArr=arr.filter(i=>i.disabled)console.log(newArr)3.树数据,如果是这样?lettreeData=[{id:'1',name:'AAA',disabled:false,children:[{id:'1.1',name:'BBB',disabled:false,children:[{id:'1.1.1',名称:'CCC',禁用:true,儿童:[]},{id:'1.1.2',名称:'DDD',禁用:true,儿童:[]},]},{id:'1.2',名称:'EEE',禁用:true,子级:[]},]},{id:'2',名称:'FFF',禁用:true,子级:[{id:'2.1',名称:'GGG',禁用:true,儿童:[{id:'2.1.1',名称:'HHH',禁用:false,儿童:[]},{id:'2.1.2',名称:'III',禁用:true,children:[]},]},{id:'2.2',name:'JJJ',disabled:false,children:[]},{id:'2.3',name:'KKK',disabled:false,children:[]},{id:'2.4',name:'LLL',disabled:true,children:[]},]}]tree数据的特点是不知道有多少layersithas因此,遇到树数据,别想了,肯定是递归的4.定义递归函数定义递归过滤函数//定义递归方法,接收数组函数deepFilter(list){//使用filter过滤当前层returnlist.filter(item=>{//filter其实就是遍历//为当前遍历的节点的children调用一次deepFilter函数,返回过滤后的数组并重新赋值item.children=deepFilter(item.children)//最后判断当前节点是否满足过滤要求returnitem.disabled})}5.完整示例Tips可以直接复制完整示例看效果lettreeData=[{id:'1',名称:'AAA',禁用:false,孩子:[{id:'1.1',名称:'BBB',禁用:false,孩子:[{id:'1.1.1',名称:'CCC',禁用:真,儿童:[]},{id:'1.1.2',名称:'DDD',禁用:true,儿童:[]},]},{id:'1.2',名称:'EEE',禁用:true,孩子:[]},]},{id:'2',名称:'FFF',禁用:true,孩子:[{id:'2.1',名称:'GGG',禁用:true,孩子:[{id:'2.1.1',name:'HHH',disabled:false,children:[]},{id:'2.1.2',name:'III',disabled:true,children:[]},]},{id:'2.2',name:'JJJ',disabled:false,children:[]},{id:'2.3',name:'KKK',disabled:false复制代码,children:[]},{id:'2.4',name:'LLL',disabled:true,children:[]},]}]//定义一个递归方法,接收一个数组函数deepFilter(list){//使用filter过滤当前层的数组returnlist.filter(item=>{//filter其实就是遍历//为当前遍历的节点的children调用一次deepFilter函数,返回过滤后的数组并重新赋值item。children=deepFilter(item.children)//最后判断当前节点是否满足过滤要求returnitem.disabled})}//调用letnewArr=deepFilter(treeData)//格式化打印,看效果console.log(JSON.stringify(newArr,null,4));