递归算法将字符串转化为tree结构,实现多级下拉

需求:将后台返回的如下字符串:
在这里插入图片描述
pc端使用:解析为前端element ui ===》el-cascader可渲染的树级结构:
在这里插入图片描述

 // 多级下拉转化
    cascaderZhua(e) {
      if (e) {
        let str = e.replace(/\<p\>/g, '')
        let str2 = str.replace(/\<\/p\>/g, ',')
        let str3 = str2.substring(0, str2.length - 1)
        let str4 = str3.split(',')
        // console.log(str4);

        let dropData = []
        var index = 0
        var hierarchyMap = new Map()
        let dropContent = str4

        dropContent.forEach((item) => {
          let prefixData = item.match(/^[-]+/)

          index += 1
          let dropDataItem = {}
          //序号
          dropDataItem.id = index
          dropDataItem.value = index
          //层级
          let hierarchy = 0

          if (prefixData != null) {
            hierarchy = prefixData[0].length
            dropDataItem.label = item.substring(hierarchy)
          } else {
            dropDataItem.label = item
          }
          hierarchyMap.set(hierarchy, dropDataItem.id)
          if (hierarchy === 0) {
            //顶层
            dropDataItem.parentId = -1
          } else {
            //设置父级id
            let parentId = hierarchyMap.get(hierarchy - 1)
            if (parentId === undefined) {
              dropDataItem.parentId = -1
            } else {
              dropDataItem.parentId = parentId
            }
          }
          dropDataItem.children = []
          dropData.push(dropDataItem)
        })
        let multiDrop = []
        dropData
          .filter((dropDataItem) => dropDataItem.parentId === -1)
          .forEach((item) => {
            multiDrop.push({
              label: item.label,
              value: item.label,
              children: item.children,
            })
            this.addChildren(item, dropData)
          })
        return multiDrop
      }
    },
    // 递归调用
    addChildren(parentItem, dropData) {
      dropData
        .filter((dropDataItem) => dropDataItem.parentId === parentItem.id)
        .forEach((item) => {
          // arentItem.children.push(item)
          parentItem.children.push({
            label: item.label,
            value: item.label,
            children: item.children,
          })
          this.addChildren(item, dropData)
        })
    },

移动端使用:解析为前端vant ui ===》van-cascader可渲染的树级结构:

cascaderZhua(e) {
      if (e) {
        let str = e.replace(/\<p\>/g, '')
        let str2 = str.replace(/\<\/p\>/g, ',')
        let str3 = str2.substring(0, str2.length - 1)
        let str4 = str3.split(',')
        // console.log(str4);

        let dropData = []
        var index = 0
        var hierarchyMap = new Map()
        let dropContent = str4

        dropContent.forEach((item) => {
          let prefixData = item.match(/^[-]+/)

          index += 1
          let dropDataItem = {}
          //序号
          dropDataItem.id = index
          dropDataItem.value = index
          //层级
          let hierarchy = 0

          if (prefixData != null) {
            hierarchy = prefixData[0].length
            dropDataItem.text = item.substring(hierarchy)
          } else {
            dropDataItem.text = item
          }
          hierarchyMap.set(hierarchy, dropDataItem.id)
          if (hierarchy === 0) {
            //顶层
            dropDataItem.parentId = -1
          } else {
            //设置父级id
            let parentId = hierarchyMap.get(hierarchy - 1)
            if (parentId === undefined) {
              dropDataItem.parentId = -1
            } else {
              dropDataItem.parentId = parentId
            }
          }
          // dropDataItem.children = []
          dropData.push(dropDataItem)
        })
        // console.log(dropData);
        let multiDrop = []
        dropData
          .filter((dropDataItem) => dropDataItem.parentId === -1)
          .forEach((item) => {
            // multiDrop.push(item);
            multiDrop.push(item)
            this.addChildren(item, dropData)
          })
        return multiDrop
      }
    },
    // 递归调用
    addChildren(parentItem, dropData) {
      dropData
        .filter((dropDataItem) => dropDataItem.parentId === parentItem.id)
        .forEach((item) => {
          // arentItem.children.push(item)
          if (parentItem.children === undefined) {
            parentItem.children = []
          }
          parentItem.children.push(item)

          this.addChildren(item, dropData)
        })
    },
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值