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日

相关文章

  • C++ 超详细分析数据结构中的时间复杂度

    C++ 超详细分析数据结构中的时间复杂度攻略 什么是时间复杂度? 时间复杂度是用来衡量算法效率的指标,它表示的是算法的执行时间与问题规模之间的关系,通常用大O记法来表示。 如何分析时间复杂度? 1. 常见时间复杂度 以下是常见的时间复杂度及其对应的执行次数: 时间复杂度 对应执行次数 O(1) 常数级别 O(log n) 对数级别 O(n) 线性级别 O(n…

    数据结构 2023年5月17日
    00
  • Raft协议及伪码解析

    目录 节点的状态转换 follower candidate leader 伪码部分 节点初始化(Initialazation) 选举时其他节点的视角 回到candidate选举时的视角 消息如何广播复制 重要的反复出现的ReplicateLog 节点收到了LogRequest 节点如何追加log,Appendentries 再次回到leader, 如何处理L…

    算法与数据结构 2023年4月17日
    00
  • go语言数据结构之前缀树Trie

    前缀树Trie 前缀树Trie是一种树形数据结构,被用于快速查找内存中的字符串数据。它非常适合存储大量的字符串,并且能够非常快速的查找以一个指定的字符串前缀开头的全部字符串。 相关术语 在学习前缀树Trie之前,需要掌握一下相关术语: 根节点:Trie树的根节点,代表空字符串。 边:连接两个节点的线,代表一个字符。 节点:表示一个字符串,可能是某个字符串的结…

    数据结构 2023年5月17日
    00
  • Android随手笔记44之JSON数据解析

    Android随手笔记44之JSON数据解析 1. JSON数据的基本概念 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于 JavaScript 的一个子集。JSON 格式最初是为了解决 JavaScript 程序通过 AJAX 传输数据时的数据交换格式问题而出现的,但是现在已经成为了一种通用的数据格式。…

    数据结构 2023年5月17日
    00
  • java实现队列数据结构代码详解

    Java实现队列数据结构代码详解 1. 队列数据结构简介 队列(Queue)是一种先进先出(FIFO)的数据结构,支持在一端插入元素,在另一端删除元素并返回删除的元素。其操作包括入队(enqueue)和出队(dequeue)。 2. 队列实现方法 队列可以通过数组或链表来实现。其中,数组实现的队列称为顺序队列,链表实现的队列称为链式队列。 2.1 顺序队列 …

    数据结构 2023年5月17日
    00
  • C++数据结构之堆详解

    C++数据结构之堆详解 什么是堆 堆是一种完全二叉树。 堆分为大根堆和小根堆,大根堆满足每个节点的值都大于等于它的子节点,小根堆满足每个节点的值都小于等于它的子节点。 堆的实现 常见的实现堆的方式有数组和链表两种。 数组 由于二叉堆是完全二叉树,所以可以用数组来实现: 对于一个节点i,它的左子节点的下标是2 * i + 1,右子节点的下标是2 * i + 2…

    数据结构 2023年5月17日
    00
  • 稀疏数组

    引入 当在网页上下棋类游戏时,玩到中途想要离开,但是我们需要保存进度,方便下次继续 我们应该怎么实现 ? 以围棋举例 使用二维数组将棋盘记下 ,如 0 为 没有棋子 ,1 为 黑子 , 2为白子 但是没有棋子的地方都为 0 ,整个二维数组充斥着大量的无效数据 0 我们需要想一个办法来 优化存储的方式 基本介绍 当一个数组中大部分元素是同一个值时,我们可以使用…

    算法与数据结构 2023年4月19日
    00
  • Java队列数据结构的实现

    下面是实现Java队列数据结构的完整攻略。 Java队列数据结构的实现 1. 概述 队列是一种常用的线性数据结构,是“先进先出”(FIFO)的一种数据结构。队列通常具有两个操作:入队和出队,它们分别对应着在队列尾添加元素和在队列头删除元素的操作。 在Java中,有多种方式可以实现队列数据结构,本文将讲解两种常用的实现方式:基于数组的实现和基于链表的实现。 2…

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