迭代者为人,递归者为神
—————— 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
也是 这种类似的结构。