javascript 层级数据的递归遍历与节点插入

本文介绍如何使用JavaScript实现层级数据的递归遍历及节点插入操作,并提供了具体示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

javascript 层级数据的递归遍历与节点插入

  在项目中遇到层级菜单插入节点的问题 ,百度一下,都是很简单的示例,于是自己花时间写了一个,一来是自己技术积累,二是顺便帮助别人。
  首先层级菜单数据字段的设计,id  数据库自增ID,  parentid 这是菜单的父ID, text 是菜单名称。
  假设通过 API 从后台获取的菜单如据如下,相当于一个层层嵌套的 JSON 数据,child 表示子菜单。
  先通过两个示例进行层级菜单的输出。
  再通过一个自定义 insertNode(data, node) 函数,插入 节点数据。

先看一个层级数据

let data = [{
        id: 0, text: 'webdms', child: [
            {id: 1, parentid: 0, text: '一级A'},
            {id: 2, parentid: 0, text: '一级B', child: [
                {id: 9, parentid: 2, text: '二级B-1'},
                {id: 10, parentid: 2, text: '二级B-2', child: [
                    {id: 12, parentid: 10, text: '三级B-2-1'},
                    {id: 8, parentid: 10, text: '三级B-2-2'}
                ]},
                {id: 11, parentid: 2, text: '二级B-3'}
            ]},
            {id: 3, parentid: 0, text: '一级C', child: [
                {id: 4, parentid: 3, text: '二级C-1'},
                {id: 5, parentid: 3, text: '二级C-2', child: [
                    {id: 7, parentid: 5, text: '三级C-2-1'},
                    {id: 13, parentid: 5, text: '三级C-2-2'},
                ]},
                {id: 6, parentid: 3, text: '二级C-3'}]
            },
        ]
    }];

页面显示

有些同学不太清楚层级数据是如何缩进显示,这里提供两个示例:

一、利用

  • 标签

function printNodes (data) {
        document.writeln('<ul>');
        for (let i = 0; i < data.length; i++) {
            console.log(data[i]);
            document.writeln('<li>' + data[i].text + "</li>");
            if (data[i].child) {
                printNodes(data[i].child);
            }
        }
        document.writeln('</ul>');
    }

    printNodes(data);

层级菜单
二、利用 css 样式

function printNodes (data, k) {
        k++;
        for (let i = 0; i < data.length; i++) {
            document.writeln('<div style="padding-left: ' + k * 40 + 'px">' + data[i].text + '</div>');
            if (data[i].child) {
                printNodes(data[i].child, k);
            }
        }
    }

    printNodes(data, 0);

层级菜单

重点来了 , 在层级菜单数据中插入一个菜单数据

/**
     * insertNode (data, node)  在原数据 data 中,插入节点数据 node
     * @param data array  这是原数据
     * @param node object  这是要插入的节点
     * @returns {boolean}  成功插入返回 true , 插入失败返回 false
     */
    function insertNode (data, node) {

        for (let i = 0; i < data.length; i++) {
            if (data[i].id === node.parentid) {
                if (!data[i].child) {
                    data[i].child = [];
                }
                data[i].child.push(node);
                return true;
            }
            if (data[i].child && insertNode(data[i].child, node)) {
                return true;
            }
        }
        return false;
    }

    let node1 = {id: 14, parentid: 4, text: '二级C-1-1'};
    let node2 = {id: 15, parentid: 5, text: '三级C-2-3'};
    let node3 = {id: 16, parentid: 0, text: '一级D'};
    let node4 = {id: 17, parentid: 20, text: 'xxxx'};

    console.log('插入状态1:', insertNode(data, node1)); // true
    console.log('插入状态2:', insertNode(data, node2)); // true
    console.log('插入状态3:', insertNode(data, node3)); // true
    console.log('插入状态4:', insertNode(data, node4)); // false 因为找不到 node4 的 parentid 节点

展示插入的数据
插入新数据的层级菜单

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值