导航栏: 首页 评论列表

递归依赖检测,递归转循环

默认分类 2021/03/01 06:18

问题描述如下:

// 有一个数组,代表一组依赖关系:
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)

只是实现功能,代码还算不上优雅


>> 留言评论