markdown将文档目录转换成json树形结构

出处:https://www.cnblogs.com/clownblogs/p/16582098.html

获取如下的目录树
在这里插入图片描述

docsify.plugins.push(
  function (hook, vm) {
    
    
    hook.doneEach(function (content) {
    
    
      // 获取所有标题
      var cate = getCatalog()
      // 将标题转换成树形
      var treecate = toTree(cate)
      console.log(treecate);
    })
  }
)
function getCatalog() {
    
    
  const h = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']
  var elements = $('#main h1,#main h2,#main h3,#main h4,#main h5,#main h6')
  let hElements = []
  elements.each((index,key) => {
    
    
      if (h.indexOf(key.localName) > -1) {
    
    
          let text
          if (key.children && key.children.length) {
    
    
              text = getText(key.children)
          } else {
    
    
              text = key.innerHTML
          }
          hElements.push({
    
    
              hLevel: parseInt(key.localName[1]),
              text,
              id: key.localName,
              uuid: key.id,
          })
      }
  })
return hElements
}
function getText(arr) {
    
    
  let result = null
  if (!arr.length) return
  for (let i = 0; i < arr.length; i++) {
    
    
    if (arr[i].children && arr[i].children.length) {
    
    
      result = this.getText(arr[i].children)
    } else {
    
    
      result = arr[i].innerHTML
    }
  }
  return result
}
function toTree(flatArr) {
    
    
  var tree = []
  var copyArr = flatArr.map(function (item) {
    
    
    return item
  })

  // 根据指定级别查找该级别的子孙级,并删除掉已经查找到的子孙级
  var getChildrenByLevel = function (currentLevelItem, arr, level) {
    
    
    if (!currentLevelItem) {
    
    
      return
    }
    // 将level值转成负数,再进行比较
    var minusCurrentLevel = -currentLevelItem.hLevel
    var children = []
    for (var i = 0, len = arr.length; i < len; i++) {
    
    
      var levelItem = arr[i]
      if (-levelItem.hLevel < minusCurrentLevel) {
    
    
        children.push(levelItem)
      } else {
    
    
        // 只找最近那些子孙级
        break
      }
    }
    // 从数组中删除已经找到的那些子孙级,以免影响到其他子孙级的查找
    if (children.length > 0) {
    
    
      arr.splice(0, children.length)
    }
    return children
  }

  var getTree = function (result, arr, level) {
    
    
    // 首先将数组第一位移除掉,并添加到结果集中
    var currentItem = arr.shift()

    currentItem.level = level
    result.push(currentItem)
    while (arr.length > 0) {
    
    
      if (!currentItem) {
    
    
        return
      }
      // 根据当前级别获取它的子孙级
      var children = getChildrenByLevel(currentItem, arr, level)
      // 如果当前级别没有子孙级则开始下一个
      if (children.length == 0) {
    
    
        currentItem = arr.shift()
        currentItem.level = level
        if (currentItem) {
    
    
          result.push(currentItem)
        }
        continue
      }
      currentItem.children = []
      // 查找到的子孙级继续查找子孙级
      getTree(currentItem.children, children, level + 1)
    }
  }
  getTree(tree, copyArr, 1)
  return tree
}

猜你喜欢

转载自blog.csdn.net/weixin_44797182/article/details/128214836
今日推荐