字符串数组构建树结构

需求

源数据

let srcList = ['动物-昆虫-蚂蚁', '动物-昆虫', '植物-草-绿色', '植物-花-红色','植物-花-黄色']
  1. 去重分类
  2. 构建树形数据如下


[
  {
    "name": "动物",
    "children": [
      {
        "name": "昆虫",
        "children": [
          {
            "name": "蚂蚁"
          }
        ]
      }
    ]
  },
  {
    "name": "植物",
    "children": [
      {
        "name": "草",
        "children": [
          {
            "name": "绿色"
          }
        ]
      },
      {
        "name": "花",
        "children": [
          {
            "name": "红色"
          },
          {
            "name": "黄色"
          }
        ]
      }
    ]
  }
]

思路

  1. 避免多根将每一条分类信息路径,视为容器数组内的元素
  2. 使用固定指针记录目标根位置,游标指针匹配节点,移动
  3. 新增节点之前判断是否有同名节点存在,存在则进入其下层子节点
  4. 进入新增节点域,须判断当前节点是否为叶子节点,是则裁剪该子节点指向
  5. 每轮路径信息匹配,需重置游标指针于根位置

解法

function listToTree(srcList) {
  // 1.记录根位置
  let destList = []
  srcList.forEach(path => {
    // 2.待匹配项
    let pathList = path.split('-')
    // 3.将移动指针重置顶层,确保每次从根检索匹配(必须!!!)
    let levelList = destList
    // 4.遍历待询节点
    for (let name of pathList) {
      // 5.同层同名节点查找匹配
      let obj = levelList.find(item => item.name == name)
      // 6.若不存在则建立该节点
      if (!obj) {
        obj = { name, children: [] }
        levelList.push(obj)

        // 7.若当前被增节点是叶子节点,则裁剪该节点子节点属性
        if (name == pathList[pathList.length - 1]) {
          delete obj.children
        }
      }
      // 8.已有则进入下一层,继续寻找
      levelList = obj.children
    }
  })
  return destList
}

测试

let srcList = ['动物-昆虫-蚂蚁', '动物-昆虫', '植物-草-绿色', '植物-花-红色','植物-花-黄色']
let result = listToTree(srcList)
console.log(JSON.stringify(result, null, 2))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将字符串数组转换为树形结构,首先需要明确字符串数组的结构和树的定义。假设字符串数组中的每个元素表示树的节点,节点之间的关系通过字符串中的特定符号进行标识。 下面是一个示例的实现方法: 1. 定义节点类,包含节点值和子节点列表: ```python class TreeNode: def __init__(self, value): self.value = value self.children = [] ``` 2. 创建一个辅助函数,用于递归构建树: ```python def build_tree_from_array(array): if not array: return None root = TreeNode(array[0]) for child_str in array[1:]: if '.' not in child_str: # 如果没有子节点 root.children.append(TreeNode(child_str)) else: level, value = child_str.split('.', 1) if int(level) == len(root.children): # 判断是否与当前节点层数相符 root.children.append(build_tree_from_array([value])) else: build_tree_from_array([child_str], root.children[-1]) return root ``` 3. 调用函数并打印树形结构: ```python array = ["A", "A.1", "A.2", "A.2.1", "A.2.2", "A.3", "B", "B.1"] root = build_tree_from_array(array) def print_tree(node, level=0): if node: print(" " * level + node.value) for child in node.children: print_tree(child, level + 1) print_tree(root) ``` 输出结果: ``` A A.1 A.2 A.2.1 A.2.2 A.3 B B.1 ``` 这样就能将字符串数组转换为树形结构并输出。注意,上述代码适用于数组中只有一个根节点的情况,如果有多个根节点,可以将每个根节点的子节点数组作为参数递归调用 build_tree_from_array() 函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值