渲染出一棵树
Render out a tree
本文关键字:一棵树 更新时间:2023-09-26
我需要用javascript将带有关系的平面数据渲染成html树结构。我需要在没有任何图书馆帮助的情况下做这件事。数据本身是平坦的:
[
{id : 1, title : one, parent : null},
{id : 2, title : two, parent : 1},
{id : 3, title : three, parent : 2},
{id : 4, title : four, parent : null},
{id : 5, title : five, parent : 4},
{id : 6, title : six, parent : 4},
{id : 7, title : seven, parent : 6},
{id : 8, title : eight, parent : 7},
{id : 9, title : nine, parent : 8}
]
这就是想要的结果:
<div>one
<div>two
<div>three</div>
</div>
</div>
<div>four
<div>five</div>
<div>six
<div>seven
<div>eight
<div>nine
</div>
</div>
</div>
</div>
</div>
数据的深度是任意的(即,根据数据的不同,它可以是一级或一百级深)。
我一直在寻找答案,但大多数都指向库或使用嵌套的数据(在大多数情况下,这只会将嵌套问题推到服务器上)。
这里有一个递归函数,用于将对象数组(使用您的结构)转换为html
字符串,表示div
标记的层次结构。
function menuTree(nodes, parentId) {
return nodes.reduce(function(html, node) {
return html + (node.parent === parentId
? ''n<div>' + node.title + menuTree(nodes, node.id) + '</div>'
: '');
}, '');
}
你这样称呼它:
var nodes = [
{"id": 1, "title": "one", "parent": null},
{"id": 2, "title": "two", "parent": 1},
{"id": 3, "title": "three", "parent": 2},
{"id": 4, "title": "four", "parent": null},
{"id": 5, "title": "five", "parent": 4},
{"id": 6, "title": "six", "parent": 4},
{"id": 7, "title": "seven", "parent": 6},
{"id": 8, "title": "eight", "parent": 7},
{"id": 9, "title": "nine", "parent": 8}
];
var html = menuTree(nodes, null);
console.log(html);
这里有一把小提琴,以交互方式演示了上面的内容。此fiddle允许您更改json
描述并相应地复制div
树。通过使用一些基本的css
,对div
树进行了缩进绘制。
成本为O(n)的迭代方法是
function makeTree(data) {
var elements = Array(data.length + 1),
proto = document.createElement('div');
for(var i=0; i<=data.length; ++i)
elements[i] = proto.cloneNode(false);
for(var i=0; i<data.length; ++i) {
var elem = elements[data[i].id];
elements[+data[i].parent].appendChild(elem);
elem.insertBefore(
document.createTextNode(data[i].title),
elem.firstChild
);
}
return elements[0];
}
var data = [
{id : 9, title : "nine", parent : 8},
{id : 1, title : "one", parent : null},
{id : 2, title : "two", parent : 1},
{id : 3, title : "three", parent : 2},
{id : 4, title : "four", parent : null},
{id : 5, title : "five", parent : 4},
{id : 6, title : "six", parent : 4},
{id : 7, title : "seven", parent : 6},
{id : 8, title : "eight", parent : 7}
];
function makeTree(data) {
var elements = Array(data.length + 1),
proto = document.createElement('div');
for(var i=0; i<=data.length; ++i)
elements[i] = proto.cloneNode(false);
for(var i=0; i<data.length; ++i) {
var elem = elements[data[i].id];
elements[+data[i].parent].appendChild(elem);
elem.insertBefore(
document.createTextNode(data[i].title),
elem.firstChild
);
}
return elements[0];
}
document.body.appendChild(makeTree(data));
div {
padding-left: 10px;
}
即使在定义元素的数据之前将其引用为父元素,上面的代码也会起作用。然而,它假设ID是从1到n的连续整数。如果它们可以是稀疏的或字符串,那么使用对象而不是数组。平均而言,它也将是O(n)。
var data = [
{id : "id9", title : "nine", parent : "id8"},
{id : "id1", title : "one", parent : null},
{id : "id2", title : "two", parent : "id1"},
{id : "id3", title : "three", parent : "id2"},
{id : "id4", title : "four", parent : null},
{id : "id5", title : "five", parent : "id4"},
{id : "id6", title : "six", parent : "id4"},
{id : "id7", title : "seven", parent : "id6"},
{id : "id8", title : "eight", parent : "id7"}
];
function makeTree(data) {
function getEl(id) {
if(id === null) return wrapper;
return elements[id] = elements[id] || wrapper.cloneNode(false);
}
var elements = {},
wrapper = document.createElement('div');
for(var i=0; i<data.length; ++i) {
var el = getEl(data[i].id);
getEl(data[i].parent).appendChild(el);
el.insertBefore(
document.createTextNode(data[i].title),
el.firstChild
);
}
return wrapper;
}
document.body.appendChild(makeTree(data));
div {
padding-left: 10px;
}
相关文章:
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 有没有一种方法可以使用任何浏览器扩展整个dom树'的开发工具
- 如何在javascript中使用2个一维数组创建层次结构树
- 如何在同一棵树中渲染子组件
- JsTree:如何在将节点从一棵树拖到第二棵树时获取事件
- 如何使用javascript在递归对象中找到基于一键的树级别
- c#mvc一次只允许一个用户编辑树视图
- 使用 broccoli-requirejs 从同一棵树构建两个不同的文件时出错
- 如何在 d3.js 中走一棵树
- 用JavaScript创建DOM树的一种更简单的方法
- 如何知道所选节点是否是树中的一片叶子?(ExtJS 4)
- 使用treemodel.js合并两棵树
- 渲染出一棵树
- 是否有一种方法来放置一个树列在一个组合框
- 是否有一种方法可以自动打开D3折叠树节点逐个节点(对于有子节点的节点)
- 如何使活泼的手风琴看起来像一棵树
- JSTREE - 不同页面中的一棵树
- 我怎样才能递归和异步地构建一棵未知大小的树
- 当一棵树加载时,它正在窃取焦点