2017-05-09
算法
一个递归问题
迭代者为人,递归者为神
—————— L. Peter Deutsch

# 问题

请从 data 里面生成 result
00var data = [
01    {
02        "id":1,
03        "number":"100.000",
04        "name": "admin.",
05        "level":1,
06        "children": [
07            {
08                "id": 2,
09                "number": "100.210",
10                "name": "admin.marketing",
11                "level": 2
12            },
13            {
14                "id": 3,
15                "number": "100.260",
16                "name": "admin.operation",
17                "level": 2,
18                "children": [
19                    {
20                        "id": 5,
21                        "number": "260.261",
22                        "name": "operation.content",
23                        "level": 3
24                    },
25                    {
26                        "id": 6,
27                        "number": "260.262",
28                        "name": "operation.promote",
29                        "level": 2
30                    },
31                    {
32                        "id": 7,
33                        "number": "260.263",
34                        "name": "operation.service",
35                        "level": 2
36                    }
37                ]
38            },
39            {
40                "id": 4,
41                "number": "100.280",
42                "name": "admin.development",
43                "level": 2
44            }
45        ]
46    }
47]
48
49var result = [
50  {
51      "id":1,
52      "number":"100.000",
53      "name": "admin.",
54      "level":1
55  },
56  {
57      "id": 2,
58      "number": "100.210",
59      "name": "admin.marketing",
60      "level": 2
61  },
62  {
63      "id": 3,
64      "number": "100.260",
65      "name": "admin.operation",
66      "level": 2
67  },
68  {
69      "id": 4,
70      "number": "100.280",
71      "name": "admin.development",
72      "level": 2
73  },
74    {
75        "id": 5,
76        "number": "260.261",
77        "name": "operation.content",
78        "level": 3
79    },
80    {
81        "id": 6,
82        "number": "260.262",
83        "name": "operation.promote",
84        "level": 3
85    },
86    {
87        "id": 7,
88        "number": "260.263",
89        "name": "operation.service",
90        "level": 3
91    }
92]

# 利用递归实现

00// 待处理数值 
01var data = [ /** 省略 **/ ]
02
03// 递归函数
04function headFor(o, cb){
05    if (!o) return; 
06
07    o.forEach(child => {
08        cb(child); 
09        if (child.children) {
10            headFor(child.children, cb);    
11        }
12    });
13}
14
15// 遍历 data 的结果保存在 res 
16var res = []; 
17
18// 调用 递归函数headFor  (注意 第二个参数是函数)
19headFor(data, item => {
20    var temp = {}; 
21    temp.id = item.id
22    temp.number = item.number;
23    temp.name = item.name; 
24    temp.level = item.level; 
25    res.push(temp); 
26}); 
27
28// 告诉数组怎么判断两个元素 然后让他数组自己去干 
29res.sort((a, b) => {
30    return a.id > b.id; 
31}); 
32
33// 打印 
34res.forEach(e => console.log(e)); 
35console.log(JSON.stringify(res));
结果
结果
最外面的 data 是数组,其实他可以被认为是外层的 children 属性,而 data 的子元素自己也说不定有 children
而这种嵌套关系完全可以层层剥开 很有递归感
此外 npm 包的 包依赖 dependencies 也是 这种类似的结构。

# Links





回到顶部