讲师中心 微信公众号
AI工具推荐 视频效率加速

JS怎样生成组织结构图 4种布局算法可视化树形数据结构

千丽大大_5756

千丽大大_5756

发布时间:2025-06-17 16:57:01

|

1187人浏览过

|

来源于php中文网

原创

生成组织结构图的核心在于将层级数据转换为dom并应用布局算法。首先,使用json表示组织层级,接着通过递归函数将其转为dom结构,最后选择合适的布局算法进行可视化。常见的布局算法包括:1. tidy tree适合清晰层级;2. cluster dendrogram用于聚类展示;3. radial tree适用于大型结构;4. force-directed graph适合复杂关系。用d3.js实现tidy tree需定义布局、创建svg并绘制节点与连线。交互方面,通过点击事件切换子节点的显示状态并重新渲染图表以实现展开/折叠功能。

JS怎样生成组织结构图 4种布局算法可视化树形数据结构

生成组织结构图,在JS中,主要涉及到数据结构的转换和可视化两部分。核心在于将层级化的数据,转换成浏览器可以理解并渲染的DOM元素。而布局算法,则是决定组织结构图美观与否的关键。

JS怎样生成组织结构图 4种布局算法可视化树形数据结构

解决方案

首先,你需要一个包含组织层级关系的JSON数据。例如:

JS怎样生成组织结构图 4种布局算法可视化树形数据结构
[
  {
    "id": "1",
    "name": "CEO",
    "children": [
      {
        "id": "2",
        "name": "CTO",
        "children": [
          {
            "id": "3",
            "name": "研发经理"
          }
        ]
      },
      {
        "id": "4",
        "name": "CFO"
      }
    ]
  }
]

接下来,使用递归函数将这个JSON数据转换成DOM结构。每个节点用<div>表示,节点之间的关系用<code><ul></ul>和<li>表示。JS怎样生成组织结构图 4种布局算法可视化树形数据结构

function generateOrgChart(data, parentElement) {
  const ul = document.createElement('ul');
  parentElement.appendChild(ul);

  data.forEach(node => {
    const li = document.createElement('li');
    li.textContent = node.name;
    ul.appendChild(li);

    if (node.children && node.children.length > 0) {
      generateOrgChart(node.children, li);
    }
  });
}

const orgData = // 上面的JSON数据
const container = document.getElementById('orgChartContainer'); // HTML中需要有一个id为orgChartContainer的元素
generateOrgChart(orgData, container);

这段代码只是生成了基本的DOM结构,没有布局。接下来,我们需要应用布局算法。

组织结构图有哪些常见的布局算法?

常见的布局算法包括:

arcgis-js
arcgis-js

提供 ArcGIS Maps SDK for JavaScript 开发辅助,涵盖 2D/3D 地图视图、图层管理、数据可视化、空间分析等功能模块的参考和示例指导。

下载
  1. Tidy Tree: 一种经典的树形布局算法,力求在不重叠的情况下,尽可能紧凑地排列节点。
  2. Cluster Dendrogram: 聚类树状图,通常用于展示层次聚类结果,节点之间的距离代表相似度。
  3. Radial Tree: 径向树,以根节点为中心,向外辐射状展开,适合展示大型组织结构。
  4. Force-Directed Graph: 力导向图,节点之间存在虚拟的斥力和引力,通过模拟物理运动达到平衡状态,布局灵活。

每种算法都有其优缺点,选择哪种取决于你的具体需求。例如,Tidy Tree适合展示层级关系清晰、节点数量适中的组织结构;Radial Tree适合展示大型组织结构,可以更好地利用空间;Force-Directed Graph适合展示节点之间存在复杂关系的组织结构。

如何用D3.js实现Tidy Tree布局?

D3.js是一个强大的数据可视化库,可以很方便地实现各种布局算法。下面是用D3.js实现Tidy Tree布局的示例代码:

const treeData = // 上面的JSON数据

const treeLayout = d3.tree().size([width, height]); // width和height是SVG的宽高

const root = d3.hierarchy(treeData[0], d => d.children);

treeLayout(root);

const svg = d3.select("#orgChartContainer").append("svg")
    .attr("width", width)
    .attr("height", height)
  .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

svg.selectAll(".node")
  .data(root.descendants())
  .enter().append("g")
    .attr("class", "node")
    .attr("transform", d => "translate(" + d.y + "," + d.x + ")");

svg.selectAll(".node")
  .append("circle")
    .attr("r", 10)
    .style("fill", "#69b3a2");

svg.selectAll(".node")
  .append("text")
    .attr("dy", ".35em")
    .attr("x", d => d.children ? -13 : 13)
    .style("text-anchor", d => d.children ? "end" : "start")
    .text(d => d.data.name);

svg.selectAll(".link")
  .data(root.links())
  .enter().append("path")
    .attr("class", "link")
    .attr("d", d3.linkHorizontal()
        .x(d => d.y)
        .y(d => d.x));

这段代码首先定义了Tidy Tree布局,然后将数据转换成D3.js可以理解的层级结构。接着,创建SVG元素,并使用D3.js的API将节点和连接线添加到SVG中。需要注意的是,d3.linkHorizontal()函数用于生成连接线的路径,可以根据需要选择不同的连接线类型。

如何让组织结构图支持交互操作,比如展开/折叠节点?

要实现展开/折叠节点的功能,需要在节点上添加点击事件监听器。当用户点击节点时,判断该节点是否已经展开,如果是,则折叠;否则,展开。

svg.selectAll(".node")
  .on("click", function(event, d) {
    if (d.children) {
      d._children = d.children;
      d.children = null;
    } else {
      d.children = d._children;
      d._children = null;
    }
    update(d); // 重新渲染组织结构图
  });

这段代码在节点上添加了点击事件监听器。当用户点击节点时,判断该节点是否存在children属性。如果存在,则将children属性保存到_children属性中,并将children属性设置为null,表示折叠该节点;否则,将_children属性的值赋给children属性,并将_children属性设置为null,表示展开该节点。最后,调用update()函数重新渲染组织结构图。update()函数需要重新计算节点的位置和连接线的路径,并更新SVG元素。 这部分代码需要根据具体的D3.js版本和实现方式进行调整。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2235

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3582

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1196

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4119

2025.09.10

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2741

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

376

2025.12.22

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn