您的位置:首页 > Web前端 > JavaScript

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 节点


展示插入的数据

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐