JS对象递归

最近在弄一个树形结构的数据,
具体问题具体分析,拿到一个树形结构的数据,但是拼接的数据id不是唯一节点。需要自己稍微修改一下数据的属性。

  • 数据的层级不可预见
  • 次跟层级是需要特殊处理
  • 次叶层级特殊处理
  • 叶子的属性num需要冒泡到根节点
  • 拼接唯一节点id
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
let handleTree = function(data, prefix) {
if (!data || !prefix) {
return
}
let Label = keyName[prefix].name
let appIcon = keyName[prefix].icon
let arr = [];

function findleaf(obj, arr, icon, pre) {
let m = 0
for (let i in obj) {
if (pre) {
// KEY 0 || 1 未 || 删除 这个时候是次叶子节点了。
let label = i,
leaf = false,
iIcon = icon
if (i == 0 || i == 1) {
label = i > 0 ? '已' + Label : Label
leaf = true
}
if (!iIcon) {
iIcon = wordKey[i] ? i : 'default'
label = wordKey[i] ? wordKey[i] : '其它'
}
arr[m] = {
id: pre + '-' + i,
label: label,
num: 0,
appType: iIcon,
children: []
}
if (leaf) {
formatLeaf(obj[i], arr[m], i)
} else {
findleaf(obj[i], arr[m].children, iIcon, arr[m].id)
}
} else {
// 根节点
arr[m] = {
id: i,
label: i,
num: 0,
phone: true,
children: []
}
findleaf(obj[i], arr[m].children, icon, i)
}
m++
}
}
findleaf(data, arr, appIcon)
arr.map(v => {
v.num = Addnum(v.children)
return v
})
return arr;
}

function Addnum(arr) {
let nums = 0

function getNum(arr) {
let num = 0
for (let i = 0, ilen = arr.length; i < ilen; i++) {
if (!arr[i].num) {
arr[i].num = getNum(arr[i].children)
}
num = num + arr[i].num;
}
return num;
}
nums = getNum(arr)
return nums
}

function formatLeaf(obj, arr, deleteStatus) {
let nums = 0;
if (typeof obj === 'object') {
for (let i in obj) {
let key = Object.keys(obj[i])[0]
let num = Object.values(obj[i])[0]
arr.children.push({
id: arr.id + '-' + i,
label: key,
gid: i,
deleteStatus: deleteStatus,
appType: arr.appType,
num: num,
})
nums = nums + num
}
arr.num = nums
}
}