需求:过滤tree型数据中不满足条件的数据,注意点:子级数据被过滤后,会影响父级数据,如下数据:需要把type!==2 的并且没有子级的数据过滤掉,当子级全都不满足条件,全部过滤时,父级也可能要被过滤
原数据:
const data = [
{
id: 1,
type: 1,
name: '测试',
children: [
{
id: 2,
type: 1,
name: '121212',
children: [
{
id: 4,
type: 1,
name: '121212',
children: []
}, {
id: 5,
type: 1,
name: '121212',
children: []
}, {
id: 6,
type: 1,
name: '121212',
children: []
},{
id: 50,
type: 1,
name: '121212',
children: []
}
]
},
{
id: 3,
type: 1,
name: '121212',
children: []
},
{
id: 7,
type: 1,
name: 'dgsda',
children: []
}
]
}
]
思路:
1、遍历
2、找出有子级数据的项,进行递归
3、如果没有子级数据,判断是不是type!==2,如果不是,在data中去掉,i–(去掉一项后,data长度减1,所以,i要减1)
4、判断过滤自己数据后的父级数据,是否还有子级,并且是否type!=2,如果满足,去掉该项
代码方法: 时间复杂度O,空间复杂度O
// 过滤数的递归方法
let handleRecursionTree = (data){
for(let i=0;i<data.length;i++){ // 1、遍历
if(data[i].children && data[i].children.length >0 ){
// 2、找出有子级数据的项,进行递
getTreeDataByFilter(data[i].children)
if(data[i].children === 0 && data[i].type !== 2){
// 4、判断过滤自己数据后的父级数据,是否还有子级,并且是否type!=2,如果满足,去掉该项
data.splice(i,1)
i--;
}
}else {
if(data[i].type !== 2){
// 3、如果没有子级数据,判断是不是type!==2,如果不是,在data中去掉,i--
data.splice(i,1)
i--;
}
}
}
}
/*
* 获取过滤后的数据
* @params {Array} 原数据
* @return {Array} 过滤后的数据
*/
let getTreeDataByFilter = (data){
if(data || !Array.isArray(data) || data.length <= 0){
return []
}
// 拷贝原数据,避免污染源数据
const dataTree = JSON.parse(JSON.stringfy(data))
return dataTree
}