前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【刷题】Map格式转变为树状格式(简单)

【刷题】Map格式转变为树状格式(简单)

作者头像
且陶陶
发布2024-07-09 08:30:02
740
发布2024-07-09 08:30:02
举报
文章被收录于专栏:Triciaの小世界Triciaの小世界

需求

假设有一个map,数据结构如下

代码语言:javascript
复制
{
  哈尔滨: ['哈尔滨1', '哈尔滨2'],
  天津: ['天津1', '天津2'],
}

想把它转变为树状格式,该如何做:

代码语言:javascript
复制
[
    {
        "id": 1,
        "label": "哈尔滨",
        "children": [
            {
                "id": 3,
                "label": "哈尔滨1"
            },
            {
                "id": 4,
                "label": "哈尔滨2"
            }
        ]
    },
    {
        "id": 2,
        "label": "天津",
        "children": [
            {
                "id": 5,
                "label": "天津1"
            },
            {
                "id": 6,
                "label": "天津2"
            }
        ]
    }
]

思路

我们可以看到,map的键名是根节点,键值是叶子节点。 要对map进行操作,可以先把它转变为我们常用的数组形式 所以第一步可以把map转变为二维数组

代码语言:javascript
复制
const buildTree = (item) => {
  // map转为二维数组
  const data = Object.entries(item)
  return convertToTree(data)
}

这样子每一项都是一个二维数组,第一项是键名,第二项以数组的形式表示键值。 如下,其中一项

代码语言:javascript
复制
[
    "哈尔滨",
    [
        "哈尔滨1",
        "哈尔滨2"
    ]
]

我们对这个数组进行操作,首先对其解构,第一项赋值给parentLabel,第二项赋值给childrenLabels

代码语言:javascript
复制
const rootChildren = data.map((item) => {
    // 解构赋值
    const [parentLabel, childrenLabels] = item
    ...
  })

然后我们创建根节点

代码语言:javascript
复制
    // 创建父节点
    const parentNode = {
      id: parentIdCounter++,
      label: parentLabel,
      children:[]
    }

递归创建叶子节点,也就是给根节点的children属性赋值

代码语言:javascript
复制
    // 递归创建子节点
  if (childrenLabels.length) {
      parentNode.children = childrenLabels.map((childLabel) => {
        return {
          id: childIdCounter++,
          label: childLabel,
        }
      })
    }

代码

代码语言:javascript
复制
const myMap = {
  哈尔滨: ['哈尔滨1', '哈尔滨2'],
  天津: ['天津1', '天津2'],
}

// map的长度
const childLength = Object.keys(myMap).length + 1
// id计数器(自增)
let parentIdCounter = 1 // 父节点id计数器
let childIdCounter = childLength // 子节点id计数器(从开始

/* 二维数组转换成树:即第二层数组转变为相应形式的对象格式
二维数组实例:
[
  "哈尔滨",
  [
      "哈尔滨1",
      "哈尔滨2"
  ]
]  */
const convertToTree = (data) => {
  const rootChildren = data.map((item) => {
    // 解构赋值
    const [parentLabel, childrenLabels] = item

    // 创建父节点
    const parentNode = {
      id: parentIdCounter++,
      label: parentLabel,
      children: [],
    }

    // 递归创建子节点
    if (childrenLabels.length) {
      parentNode.children = childrenLabels.map((childLabel) => {
        return {
          id: childIdCounter++,
          label: childLabel,
        }
      })
    }

    // 返回父节点
    return parentNode
  })

  // 假设所有父节点都是根节点的子节点
  return rootChildren
}

/**
 * map转化为二层树
 */

const buildTree = (item) => {
  // map转为二维数组
  const data = Object.entries(item)
  return convertToTree(data)
}

const tree = buildTree(myMap)

console.log(tree)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求
  • 思路
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档