iOS 处理二叉树数据 实现多级表格

项目场景

当时项目的需求是 后台返回一个数组,我们在前端实现多级表格的效果,可以展开收缩。可以点击选择、点击取消。
后台返回的数据结构大致如下:

[
    {
        "node":"2",
         "pnode":"1",
         "value":"value"
    },
      {
        "node":"12",
         "pnode":"1",
         "value":"value"
    },
      {
        "node":"25",
         "pnode":"12",
         "value":"value"
    },
      {
        "node":"13",
         "pnode":"30",
         "value":"value"
    },
      {
        "node":"13",
         "pnode":"1",
         "value":"value"
    },
      {
        "node":"70",
         "pnode":"25",
         "value":"value"
    }


    ]

因为我们要实现多级的表格效果,所以我们必须知道哪些是父节点,父节点下有没有子节点,有多少子节点,每个子节点下又有多少子节点。

项目代码

首先我们构造我们的model:

import UIKit

class DataModel: NSObject {
    var cueerntId:String = "" //存储当前节点
    var parentId:String = "" //存储父节点
    var depth:NSInteger = 0; //当前深度
    var isExp:Bool = false// 当前是否展开
    var sonArr = [DataModel]();//存放所有的自己的子节点。

    init(cueent:String,parent:String) {
        self.cueerntId = cueent
        self.parentId = parent
    }

    override var description: String{
        get{
            return "\ncurrenrt:" + self.cueerntId + "\n parent" + self.parentId + "\ndepth" + String(self.depth) + "\n子节点数量" + String(self.sonArr.count);
        }

    }


}

数据处理:


    func handle_data(datas:[DataModel]){

        for data in datas{  
            data.depth += 1;

            for item in self.dataArr{
               if(data.cueerntId == item.parentId && !data.sonArr.contains(item))
               {
                data.sonArr.append(item)
                }
            }

            if(data.sonArr.count != 0){
                self.handle_data(datas: data.sonArr);
            }



        }

    }

调用示例:

//构建数据
         self.dataArr.append(DataModel(cueent: "2", parent: "1"));
         self.dataArr.append(DataModel(cueent: "12", parent: "1"));
         self.dataArr.append(DataModel(cueent: "122", parent: "12"));
         self.dataArr.append(DataModel(cueent: "189", parent: "122"));
        self.dataArr.append(DataModel(cueent: "13", parent: "1"));
        self.dataArr.append(DataModel(cueent: "60", parent: "13"));
        self.dataArr.append(DataModel(cueent: "80", parent: "13"));
        self.dataArr.append(DataModel(cueent: "120", parent: "12"));
        self.dataArr.append(DataModel(cueent: "200", parent: "120"));

//数据处理
self.handle_data(datas: self.dataArr);


//获得最外层数组,即父节点数组
  var data_sort_arr = [DataModel]()
        for data in self.dataArr{
            if(self.isParent(model: data)){
            data_sort_arr.append(data)
            }
        }

//此时  data_sort_arr里面的数据即是我们的多级列表的第一层,在点击时判断 sonarr里面的有没有元素 是否展开即可。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值