问题描述如下:
// 有一个数组,代表一组依赖关系:
arr = [
[1, [2, 3]],
[2, [4, 5]],
[4, [5]]
]
// ,表示:1依赖2、3;2依赖4、5;4依赖5;
// 实现一个方法,输入:arr,输出:
{
"1": {
"2": {
"4": {
"5": null
}
},
"3": null,
...
}
}
代码实现
'use strict'
var arr = [
[1, [2, 3]],
[2, [4, 5]],
[4, [5]]
]
function parse(arr) {
result = {}
var maps = {}
var list = []
arr.forEach(it => {
let obj = {
id: it[0],
children: it[1],
childmap: {},
left: it[1].length,
done: false
}
maps[it[0]] = obj
list.push(obj)
})
for (let i = list.length - 1; i > -1; i--) {
let item = list[i]
item.children.forEach(bb => {
if (!maps[bb]) {
let obj = {
id: bb,
children: null,
childmap: null,
left: 0,
done: false
}
maps[bb] = obj
list.push(obj)
}
})
}
for (let t = list.length; t > -1; t--) {
let cur = list.find(it => it.left === 0 && it.done === false)
if (!cur) {
if (list.find(it => it.left > 0)) {
console.log('解析出错,可能存在循环依赖')
} else {
console.log(result) // 解析成功,输出结果
return result
}
} else {
result[cur.id] = cur.childmap // 根节点
list.forEach(it => {
if (it.id === cur.id || !it.children) return ''
let cid = +cur.id
for (let j = it.children.length - 1; j > -1; j--) {
if (it.children[j] === cid) {
it.children.splice(j, 1)
it.left--
it.childmap[cur.id] = cur.childmap // 子节点
}
}
})
cur.done = true
}
}
}
debugger;parse(arr)
只是实现功能,代码还算不上优雅