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

来源:互联网 发布:美国国籍 知乎 编辑:程序博客网 时间:2024/06/09 17:17

项目场景

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

[    {        "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 UIKitclass 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里面的有没有元素 是否展开即可。
原创粉丝点击