js 解析和操作树 —— 获取树的深度、提取并统计树的所有的节点和叶子节点、添加节点、修改节点、删除节点

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: js 解析和操作树 —— 获取树的深度、提取并统计树的所有的节点和叶子节点、添加节点、修改节点、删除节点

树的源数据

treeData: {
                    "label": "中国",
                    "children":
                        [
                            {
                                "label": "浙江",
                                "children":
                                    [
                                        {"label": "杭州"},
                                        {"label": "宁波"},
                                    ]
                            },
                            {
                                "label": "广西",
                                "children":
                                    [
                                        {
                                            "label": "桂林",
                                            "children":
                                                [
                                                    {"label": "秀峰区"},
                                                    {"label": "叠彩区"},
                                                ]
                                        },
                                        {"label": "南宁"},
                                    ]
                            },
                            {
                                "label": "黑龙江",
                            },
                            {
                                "label": "新疆",
                            }
                        ]
                }

获取树的深度

    // 获取树的深度
    function getTreeDeep(treeData) {
        let arr = [];
        arr.push(treeData);
        let depth = 0;
        while (arr.length > 0) {
            let temp = [];
            for (let i = 0; i < arr.length; i++) {
                temp.push(arr[i]);
            }
            arr = [];
            for (let i = 0; i < temp.length; i++) {
                if (temp[i].children && temp[i].children.length > 0) {
                    for (let j = 0; j < temp[i].children.length; j++) {
                        arr.push(temp[i].children[j]);
                    }
                }
            }
            if (arr.length >= 0) {
                depth++;
            }
        }
        return depth;
    }

使用

this.treeDeep = getTreeDeep(this.treeData)

提取并统计树所有的节点

    // 提取树的所有节点,最终树的所有节点都会存入传入的nodeList数组中
    function getAllTreeNode(treeData, nodeList) {
        // 判断是否为数组
        if (Array.isArray(treeData)) {
            treeData.forEach(item => {
                if (item.children && item.children.length > 0) {
                    nodeList.push(item)
                    getAllTreeNode(item.children, nodeList)
                } else {
                    nodeList.push(item)
                }
            })
        } else {
            if (treeData.children && treeData.children.length > 0) {
                nodeList.push(treeData)
                getAllTreeNode(treeData.children, nodeList)
            } else {
                nodeList.push(treeData)
            }
        }
    }

使用 —— 提取所有叶子节点到  treeNodeList

getAllTreeNode(this.treeData, this.treeNodeList)

节点总数为

this.treeNodeList.length

提取并统计树的叶子节点

    // 提取树的叶子节点,最终所有树的叶子节点都会存入传入的leafList数组中
    function getTreeLeaf(treeData, leafList) {
        // 判断是否为数组
        if (Array.isArray(treeData)) {
            treeData.forEach(item => {
                if (item.children && item.children.length > 0) {
                    getTreeLeaf(item.children, leafList)
                } else {
                    leafList.push(item)
                }
            })
        } else {
            if (treeData.children && treeData.children.length > 0) {
                getTreeLeaf(treeData.children, leafList)
            } else {
                leafList.push(treeData)
            }
        }
    }

使用 —— 提取所有叶子节点到  treeLeafList

getTreeLeaf(this.treeData, this.treeLeafList)

叶子节点总数为

this.treeLeafList.length

添加节点

添加兄弟节点

选中一个节点后,添加兄弟节点【递归】

添加子节点

vue中操作树,selectNode为选中节点构成的数组

修改节点

删除节点

目录
相关文章
|
18小时前
|
JavaScript
js 解析lrc文件(歌词)
js 解析lrc文件(歌词)
6 1
|
1天前
|
前端开发 开发者
深入解析Vite.js源码
【7月更文挑战第1天】Vite.js 深入解析:以其无bundle开发、动态ES模块加载提升开发效率;本地HTTP服务器配合WebSocket实现热更新;按需加载减少资源占用;预构建优化生产环境性能;基于Rollup的插件系统增强灵活性。Vite,一个创新且高效的前端构建工具。
10 0
|
2天前
|
存储 算法 搜索推荐
深入解析String数组的操作与性能优化策略
深入解析String数组的操作与性能优化策略
|
2天前
|
JavaScript
js 获取并解析 url 中参数的三种方法
js 获取并解析 url 中参数的三种方法
6 0
|
9月前
|
前端开发 JavaScript
探索JavaScript元素节点的属性和方法
探索JavaScript元素节点的属性和方法
21 0
|
2月前
|
前端开发 JavaScript
探索JavaScript元素节点的属性和方法
探索JavaScript元素节点的属性和方法
16 0
|
JavaScript 前端开发
前端祖传三件套JavaScript的DOM之节点层次、类型、属性
随着互联网的不断发展,前端技术也在不断地更新迭代。但是,无论怎么更新变化,JavaScript、DOM、CSS 三件套的重要性始终不可替代。其中,JavaScript 的作用尤为关键。本文将聚焦于 JavaScript 中的 DOM,讨论节点层次、类型和属性等概念。
123 0
|
JavaScript 前端开发
Javascript 节点属性
Javascript 节点属性
70 0
|
JavaScript 前端开发
JavaScript 技术篇-js语句创建dom节点,并给节点设置属性
JavaScript 技术篇-js语句创建dom节点,并给节点设置属性
257 0
JavaScript 技术篇-js语句创建dom节点,并给节点设置属性
|
JavaScript 前端开发
JavaScript 技术篇-js获取dom节点、html标签自定义属性的值。
JavaScript 技术篇-js获取dom节点、html标签自定义属性的值。
787 0
JavaScript 技术篇-js获取dom节点、html标签自定义属性的值。

推荐镜像

更多