Javascript中扁平化数据结构与JSON树形结构转换详解

yizhihongxing

一、扁平化数据结构

扁平化数据结构是指将一个JSON树形结构数据转换为一个扁平化的对象数组,通常用于在数据操作中进行遍历和检索,方便数据的处理和展示。

例如,有一个JSON树形结构数据如下:

{
  "name": "中国",
  "children": [
    {
      "name": "北京市",
      "children": [
        {
          "name": "海淀区"
        },
        {
          "name": "朝阳区"
        }
      ]
    },
    {
      "name": "上海市",
      "children": [
        {
          "name": "黄浦区"
        },
        {
          "name": "徐汇区"
        }
      ]
    }
  ]
}

将其转换为扁平化数据结构,得到以下对象数组:

[
  {
    "name": "中国"
  },
  {
    "name": "北京市"
  },
  {
    "name": "海淀区"
  },
  {
    "name": "朝阳区"
  },
  {
    "name": "上海市"
  },
  {
    "name": "黄浦区"
  },
  {
    "name": "徐汇区"
  }
]

可以看到,扁平化数据结构将树形结构中的每个节点都以对象的形式存储在数组中,便于遍历和操作。

二、JSON树形结构转换

JSON树形结构转换是指将一个扁平化的对象数组转换为一个JSON树形结构数据,通常用于在数据展示中进行分级和归组,方便数据的渲染和展示。

例如,有以下扁平化数据结构:

[
  {
    "name": "中国"
  },
  {
    "name": "北京市"
  },
  {
    "name": "海淀区"
  },
  {
    "name": "朝阳区"
  },
  {
    "name": "上海市"
  },
  {
    "name": "黄浦区"
  },
  {
    "name": "徐汇区"
  }
]

将其转换为JSON树形结构,得到以下数据:

{
  "name": "中国",
  "children": [
    {
      "name": "北京市",
      "children": [
        {
          "name": "海淀区"
        },
        {
          "name": "朝阳区"
        }
      ]
    },
    {
      "name": "上海市",
      "children": [
        {
          "name": "黄浦区"
        },
        {
          "name": "徐汇区"
        }
      ]
    }
  ]
}

可以看到,JSON树形结构将扁平化数据结构中的每个节点按照其层级关系进行组织,以树形结构的形式进行展示。

三、示例说明

示例一:扁平化数据结构转换

以下是一个扁平化数据结构的例子:

[
  {
    "id": 1,
    "name": "中国"
  },
  {
    "id": 2,
    "name": "北京市",
    "parent_id": 1
  },
  {
    "id": 3,
    "name": "海淀区",
    "parent_id": 2
  },
  {
    "id": 4,
    "name": "朝阳区",
    "parent_id": 2
  },
  {
    "id": 5,
    "name": "上海市",
    "parent_id": 1
  },
  {
    "id": 6,
    "name": "黄浦区",
    "parent_id": 5
  },
  {
    "id": 7,
    "name": "徐汇区",
    "parent_id": 5
  }
]

该数据表示了一个地区的层次关系,其中每个节点都包含一个唯一id和对应的name,使用parent_id表示父节点id,没有父节点的节点为根节点。

将其转换为JSON树形结构,可以使用递归的方式进行组织,JavaScript代码如下:

function buildTree(data, rootId) {
  // 递归构建树形结构
  const tree = []
  const map = {}
  data.forEach(item => {
    map[item.id] = item
    item.children = []
  })
  data.forEach(item => {
    if (item.parent_id && map[item.parent_id]) {
      map[item.parent_id].children.push(item)
    } else {
      tree.push(item)
    }
  })
  return tree
}

// 示例:
const data = [
  {
    "id": 1,
    "name": "中国"
  },
  {
    "id": 2,
    "name": "北京市",
    "parent_id": 1
  },
  {
    "id": 3,
    "name": "海淀区",
    "parent_id": 2
  },
  {
    "id": 4,
    "name": "朝阳区",
    "parent_id": 2
  },
  {
    "id": 5,
    "name": "上海市",
    "parent_id": 1
  },
  {
    "id": 6,
    "name": "黄浦区",
    "parent_id": 5
  },
  {
    "id": 7,
    "name": "徐汇区",
    "parent_id": 5
  }
]

const tree = buildTree(data, 1)
console.log(JSON.stringify(tree, null, 2))

输出结果为:

[
  {
    "id": 1,
    "name": "中国",
    "children": [
      {
        "id": 2,
        "name": "北京市",
        "parent_id": 1,
        "children": [
          {
            "id": 3,
            "name": "海淀区",
            "parent_id": 2,
            "children": []
          },
          {
            "id": 4,
            "name": "朝阳区",
            "parent_id": 2,
            "children": []
          }
        ]
      },
      {
        "id": 5,
        "name": "上海市",
        "parent_id": 1,
        "children": [
          {
            "id": 6,
            "name": "黄浦区",
            "parent_id": 5,
            "children": []
          },
          {
            "id": 7,
            "name": "徐汇区",
            "parent_id": 5,
            "children": []
          }
        ]
      }
    ]
  }
]

可以看到,该代码将扁平化数据结构转换为JSON树形结构,并按照层级关系进行分组,形成了一个树的形式展示。

示例二:JSON树形结构转换

以下是一个JSON树形结构的例子:

{
  "name": "中国",
  "children": [
    {
      "name": "北京市",
      "children": [
        {
          "name": "海淀区"
        },
        {
          "name": "朝阳区"
        }
      ]
    },
    {
      "name": "上海市",
      "children": [
        {
          "name": "黄浦区"
        },
        {
          "name": "徐汇区"
        }
      ]
    }
  ]
}

该数据表示了一个地区的层次关系,其中每个节点都包含一个name和对应的子节点children,使用children表示该节点下的子节点,没有子节点的节点为叶子节点。

将其转换为扁平化数据结构,可以使用递归的方式进行组织,JavaScript代码如下:

function flattenTree(tree) {
  // 递归构建扁平化数据结构
  const result = []
  const dfs = (node, level) => {
    result.push({
      name: node.name,
      level: level
    })
    if (node.children && node.children.length > 0) {
      node.children.forEach(child => dfs(child, level + 1))
    }
  }
  dfs(tree, 0)
  return result
}

// 示例:
const tree = {
  "name": "中国",
  "children": [
    {
      "name": "北京市",
      "children": [
        {
          "name": "海淀区"
        },
        {
          "name": "朝阳区"
        }
      ]
    },
    {
      "name": "上海市",
      "children": [
        {
          "name": "黄浦区"
        },
        {
          "name": "徐汇区"
        }
      ]
    }
  ]
}

const result = flattenTree(tree)
console.log(JSON.stringify(result, null, 2))

输出结果为:

[
  {
    "name": "中国",
    "level": 0
  },
  {
    "name": "北京市",
    "level": 1
  },
  {
    "name": "海淀区",
    "level": 2
  },
  {
    "name": "朝阳区",
    "level": 2
  },
  {
    "name": "上海市",
    "level": 1
  },
  {
    "name": "黄浦区",
    "level": 2
  },
  {
    "name": "徐汇区",
    "level": 2
  }
]

可以看到,该代码将JSON树形结构转换为扁平化数据结构,并按照节点的层级关系进行分组,形成了一个对象数组的形式进行展示。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Javascript中扁平化数据结构与JSON树形结构转换详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • mysql的Buffer Pool存储及原理解析

    下面我就来详细讲解一下“mysql的Buffer Pool存储及原理解析”的攻略。 Buffer Pool简介 在MySQL中,Buffer Pool是一个重要的概念,也可以说是MySQL最重要的性能优化建议之一。Buffer Pool是MySQL内存中缓存数据页的数据结构,用于加速数据的读写。 数据页 在MySQL中,数据是以数据页(page)为单位进行读…

    数据结构 2023年5月17日
    00
  • Java数据结构之有向图的拓扑排序详解

    下面我将为您详细讲解“Java数据结构之有向图的拓扑排序详解”的完整攻略。 拓扑排序概述 拓扑排序是一种常见的有向无环图(DAG)的排序方法,该算法将DAG图中所有节点排序成一个线性序列,并且使得所有的依赖关系都满足从前向后的顺序关系。一般来说,DAG图的所有节点可以表示为一个任务依赖关系,而拓扑排序则可以对这些任务进行排序,确保每个任务在它所依赖的任务之后…

    数据结构 2023年5月17日
    00
  • C语言数据结构之队列的定义与实现

    C语言数据结构之队列的定义与实现 什么是队列 队列是一种特殊的线性数据结构,它只允许在队列的头部进行删除操作,在队列的尾部进行插入操作,这种操作方式被成为“先进先出”或“FIFO(first in first out)”。 队列的实现方式 队列可以通过数组和链表两种方式进行实现。 1. 数组实现 数组实现队列时,可以定义一个存放元素的数组,同时需要记录队列的…

    数据结构 2023年5月17日
    00
  • el-tree的实现叶子节点单选的示例代码

    下面我将详细讲解“el-tree的实现叶子节点单选的示例代码”的完整攻略。 示例代码实现 el-tree 的实现叶子节点单选,需要在 el-tree 上绑定 @check-change 事件,并通过 check-strictly 属性来配置选择模式。代码示例如下: <template> <el-tree :data="data&q…

    数据结构 2023年5月17日
    00
  • Java数据结构与算法之单链表深入理解

    Java数据结构与算法之单链表深入理解攻略 什么是单链表? 单链表(Singly Linked List)是指一个节点只指向下一个节点的链表。 单链表由多个节点组成,每个节点有两个属性:数据域和指针域。数据域保存节点的数据,指针域保存下一个节点的指针,因此每个节点包含两个域:data和next。 单链表的基本操作 单链表常用的基本操作包括: 在链表头部添加元…

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之递归

    带你了解Java数据结构和算法之递归 什么是递归? 递归是一种算法或计算机程序的设计方法,在程序执行过程中直接或间接的调用自身。 递归的实现方式 递归的实现通常使用函数进行的。在函数中,我们首先检查停止条件(递归基)是否满足,如果满足,我们停止递归;否则,我们调用自身递归进行下一步计算。 递归的应用场景 递归通常在解决问题中使用。对于像树、图等复杂结构的遍历…

    数据结构 2023年5月17日
    00
  • 【ACM算法竞赛日常训练】DAY3题解与分析【旅游】【tokitsukaze and Soldier】

    DAY3共2题: 旅游 tokitsukaze and Soldier ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验): 旅游 题目传送门:https://ac.nowcoder…

    算法与数据结构 2023年4月18日
    00
  • ecnuoj 5039 摇钱树

    5039. 摇钱树 题目链接:5039. 摇钱树 感觉在赛中的时候,完全没有考虑分数规划这种做法。同时也没有想到怎么拆这两个交和并的式子。有点难受…… 当出现分数使其尽量大或者小,并且如果修改其中直接相关的某个值会导致分子分母同时变化的时候,还是要多想想分数规划的做法。 下面引用一下题解 另外这两个交和并的式子,令 \(a = S \and T, b = T…

    算法与数据结构 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部