项目场景
当时项目的需求是 后台返回一个数组,我们在前端实现多级表格的效果,可以展开收缩。可以点击选择、点击取消。
后台返回的数据结构大致如下:
[
{
"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里面的有没有元素 是否展开即可。