美文网首页
树状数据操作

树状数据操作

作者: 炫海神鹰 | 来源:发表于2018-08-17 18:16 被阅读0次

    目录

    • 树结构-扁平化
    
    {
      text: '一级', // 要显示的文本
      value: 1,  // 唯一值
      checked: false, // 选中转态
      children: [{
        text: '二级-1',
        value: 11,
        checked: false,
        children: [{
          text: '三级-1',
          value: 111,
          checked: false,
        }]
      }, {
        text: '二级-2',
        value: 12,
        checked: false,
      }]
    }
    
    

    需要转化成以下格式

    [ { text: '一级',
        value: 1,
        checked: false,
        disabled: false,
        showSign: true,
        parent: null },
      { text: '二级-1',
        value: 11,
        checked: false,
        disabled: false,
        parent: 1 },
      { text: '三级-1',
        value: 111,
        checked: false,
        disabled: false,
        parent: 11 },
      { text: '二级-2',
        value: 12,
        checked: false,
        disabled: false,
        parent: 1 } ]
    

    代码实现

    let tree = {
      text: '一级', // 要显示的文本
      value: 1,  // 唯一值
      checked: false, // 选中转态
      children: [{
        text: '二级-1',
        value: 11,
        checked: false,
        children: [{
          text: '三级-1',
          value: 111,
          checked: false,
        }]
      }, {
        text: '二级-2',
        value: 12,
        checked: false,
      }]
    }
    var result = []
    function treeToLine(tree, treeKey, isRoot = true, root = null) {
      if (!tree || !tree.children) return result
      let obj = {}
      for (let key in tree) {
        if (tree.hasOwnProperty(key) && key !== 'children') {
          obj[key] = tree[key]
        }
      }
      obj.parent = isRoot ? null : root[treeKey]
      result.push(obj)
      for (let child of tree.children) {
        if (child && child.children) {
          treeToLine(child, treeKey, false, tree)
        } else if (child && !child.children){ // 最后一层
          child.parent = tree[treeKey]
          result.push(child)
          return result
        }
      }
    }
    console.log(treeToLine(tree, 'value'))
    

    其中函数第二个参数为每层树的唯一值,用于parent进行标识所属的父节点。

    • 扁平化-树结构
      将上述扁平化数据格式化成树状数据:

    实现代码:

    function lineToTree(data, value = 'value', parentId = 'parent') {
      let children = 'children'
    
      let valueMap = [], tree = []
      data.forEach(v => {
        valueMap[v[value]] = v
      })
    
      data.forEach(v => {
        let parent = valueMap[v[parentId]]
        if(parent) {
          !parent[children] && (parent[children] = [])
          parent[children].push(v)
        } else {
          tree.push(v)
        }
      })
      return tree
    }
    

    其中参数value是树状结构的唯一标识,parentId是父节点的键值。

    1000个节点权限树性能优化

    • 组装后台返回的数据结构
    • 通过关键字搜索时遍历tree 对比节点下关键字是否存在


      image.png
      image.png
      image.png

    相关文章

      网友评论

          本文标题:树状数据操作

          本文链接:https://www.haomeiwen.com/subject/krmtiftx.html