js过滤筛选树(tree),过滤不满足条件的项

需求:过滤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
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值