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

一、扁平化数据结构

扁平化数据结构是指将一个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日

相关文章

  • 数据结构课程设计-用栈实现表达式求值的方法详解

    数据结构课程设计-用栈实现表达式求值的方法详解 本文将详细讲解如何用栈实现表达式求值的方法。根据表达式的不同形式(中缀表达式、前缀表达式、后缀表达式),我们可以采用不同的方法来实现表达式求值。在本文中,我们将主要讲解中缀表达式求值的过程。 中缀表达式求值的步骤 中缀表达式通常是我们最常接触到的表达式形式,如 2+3*4-5。在求解中缀表达式的结果时,我们通常…

    数据结构 2023年5月16日
    00
  • Go语言数据结构之二叉树必会知识点总结

    Go语言数据结构之二叉树必会知识点总结 二叉树是一种非常重要的数据结构,它被广泛应用于算法、数据处理等领域。在Go语言中,使用二叉树可以实现很多高级数据结构和算法。本文将为大家介绍二叉树相关的基本知识和操作,以及如何利用Go语言实现二叉树。 什么是二叉树? 二叉树是一种树形结构,由一个根节点和两个子树组成。它的每个节点最多有两个子节点,称为左子节点和右子节点…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之时间空间复杂度入门

    C语言数据结构与算法之时间空间复杂度入门攻略 1. 什么是时间复杂度和空间复杂度? 在进行算法设计时,我们不仅需要考虑到算法的正确性,还要考虑到算法的执行效率。而衡量算法执行效率的指标主要有两个,即时间复杂度和空间复杂度: 时间复杂度:衡量算法所需时间的度量,通常用“大O”符号来表示。比如,对于n个元素的数组,某些算法需要执行n次操作,这个算法的时间复杂度就…

    数据结构 2023年5月16日
    00
  • C语言链表案例学习之通讯录的实现

    让我详细讲解一下“C语言链表案例学习之通讯录的实现”的完整攻略。 1. 案例简介 本案例的目的是通过实现一个简单的通讯录程序,来学习C语言链表的原理和操作。程序主要功能涵盖通讯录添加、删除、修改以及查询。 2. 程序架构 程序的整体结构如下所示: 头文件声明 结构体定义 函数声明 主函数 函数实现 其中,头文件声明包含stdio.h、stdlib.h以及st…

    数据结构 2023年5月17日
    00
  • Java数据结构之图的路径查找算法详解

    Java数据结构之图的路径查找算法详解 什么是图? 在计算机科学中,图是一种非常常见的数据结构,用于表示图形和网络等概念。图由节点和边组成,其中节点表示实体,边表示这些实体之间的关系。节点和边可以表示各种各样的实体和关系,因此图在计算机科学中具有广泛的应用。 图的路径查找算法 路径查找算法是一个用途广泛的算法,它用于查找从一个节点到另一个节点的路径。在图中,…

    数据结构 2023年5月17日
    00
  • MySQL索引背后的数据结构及算法原理详解

    《MySQL索引背后的数据结构及算法原理详解》是一篇介绍MySQL索引背后的数据结构和算法原理的文章。MySQL索引是提高查询效率的一个重要工具,理解其背后的数据结构和算法原理对于提高数据库性能和优化查询操作是非常有帮助的。 本文主要分为以下三部分: MySQL索引背后的数据结构 索引的几种常见数据结构及其优缺点 索引的算法原理 MySQL索引背后的数据结构…

    数据结构 2023年5月17日
    00
  • C++数据结构的队列详解

    C++数据结构的队列详解 队列是什么? 队列是一种先进先出(First In First Out, FIFO)的数据结构,类似于现实生活中的排队等待服务。 队列中的数据按照先进先出的原则被处理。新的元素只能被插入在队列的末尾,而旧的元素只能从队列的开头被删除。因此,队列的末尾称为队尾,队列的开头被称为队头。 队列的实现方式 数组实现方式 队列可以使用数组实现…

    数据结构 2023年5月17日
    00
  • 关于图片存储格式的整理(BMP格式介绍)

    关于图片存储格式的整理(BMP格式介绍) 一、BMP格式概述 BMP全称为Bitmap,是一种基础的图像保存格式,它的格式十分简单,就是将每个像素点的颜色信息直接保存在文件中,因此它的信息量相对较大。 BMP格式的文件头有标准结构,其中包含位图的宽、高、颜色数、位图大小等信息,其中颜色数的位数(色深)决定了BMP文件的大小。BMP文件还可以包含调色板,来进行…

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