javascript 层级数据的递归遍历与节点插入
2017-09-13 22:38
549 查看
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 节点
展示插入的数据
相关文章推荐
- 二叉搜索树的相关操作:插入节点,删除节点,排序,查找,最大值,最小值,前序,中序,后序遍历(主要用到递归的方法)
- javascript数据结构与算法--二叉树(插入节点、生成二叉树)
- JavaScript之jQuery-3 jQuery操作DOM(查询、样式操作、遍历节点、创建插入删除、替换、复制)
- python递归父子节点数据,打印节点路径层级
- 【MySQL】MySQL层级数据的递归遍历
- 二叉树的插入,递归遍历和深度节点数
- javascript递归遍历所有DOM文档节点
- 数据结构——单链表的创建、删除、遍历以及节点的插入、删除等操作
- (C语言)BinarySrearchTree二叉搜索树 --- 标准插入(递归,非递归)、遍历(前,中,后序)、查找(递归,非递归)、根插入递归(左旋,右旋)、最小最大值、删除节点
- SQL SERVER 2000 遍历父子关系数据的表(二叉树)获得所有子节点 所有父节点及节点层数函数
- Easyui-ComboTree数据填充,递归。树形节点
- 二叉树第K层的第M个节点 -- 采用非递归层次遍历实现
- JavaScript遍历页面寻找节点的一些技巧
- 数据结构——2 单链表插入和删除节点
- 数据结构与算法 -- 二叉树链式详解((非)/递归遍历,叶子个数,深度计算)
- JQ遍历数据插入已有的TD列(已有的CLASS)
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- JavaScript创建和遍历JSON数据
- javascript递归、循环、迭代、遍历和枚举概念
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果