62,614
社区成员
发帖
与我相关
我的任务
分享
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<pre id="result"></pre>
<script>
class Tree {
/**
* 使用表示树的节点的数组创建树,数组元素的属性中需要有 id 和 parentId 两个属性,其他属性不受限制
* 数组元素的格式为 { id: 3, name: 'C', parentId: 1 },表示当前节点是 id 为 1 的节点的子节点
*
* TODO: 一级节点的 id, parentId 属性名和 parentId 的值可以使用参数传过来,而不是固定死的
*
* @param {Array} nodes 表示树节点的数组
*/
constructor(nodes) {
nodes = JSON.parse(JSON.stringify(nodes)); // 深拷贝 nodes,避免外部修改 nodes 破坏树的结构
this.root = Tree.build(nodes);
}
/**
* 根据数组中元素的关系构造树,子节点存储在父节点的 children 数组中
*
* @param {Array} nodes 表示树的节点数组
* @return {Json} 返回树的根节点
*/
static build(nodes) {
// 构造树节点的父子关系
var root = { id: 0, name: 'Root', children: [] };
nodes.forEach((node) => {
// 选择 parentId 为 0 的节点作为根节点的子节点
if (node.parentId === 0) {
root.children.push(node);
}
var parent = Tree.findParent(nodes, node.parentId);
// 如果找到父节点,则把节点添加到父节点的 children 数组中
if (parent) {
if (!parent.children) {
parent.children = [];
}
parent.children.push(node);
}
});
return root;
}
/**
* 使用父节点的 id 查找父节点
*
* @param {Array} nodes 表示树的节点数组
* @param {Integer} parentId 父节点的 id
* @return {Json} 找到返回父节点,否则返回 null
*/
static findParent(nodes, parentId) {
for (var i=0; i<nodes.length; ++i) {
var node = nodes[i];
if (node.id == parentId) {
return node;
}
}
return null;
}
}
/*
|--A
| |--C
| |--D
| |--E
| |--F
| |--G
|--B
|--H
|--I
*/
var nodes = [
{ id: 1, name: 'A', parentId: 0 },
{ id: 2, name: 'B', parentId: 0 },
{ id: 3, name: 'C', parentId: 1 },
{ id: 4, name: 'D', parentId: 1 },
{ id: 5, name: 'E', parentId: 4 },
{ id: 6, name: 'F', parentId: 4 },
{ id: 7, name: 'G', parentId: 6 },
{ id: 8, name: 'H', parentId: 2 },
{ id: 9, name: 'I', parentId: 2 },
];
var tree = new Tree(nodes);
document.getElementById('result').innerHTML = JSON.stringify(tree.root, null, 4);
</script>
</body>
</html>
看你展示风格,是WEB功能? ------------- 这类功能实现是对程序用法先加载,再按层数和父级ID关系逐层展开
没太明白你的意思,结果出来,显示就不难了 比如平铺全部展开显示,标题的缩进,你根据levels的值缩进就行 如果初始收缩显示,你初始化先显示最高一级,先加载levels=1,然后根据它有没有子节点,是否显示扩展的 + 图标 这样,最好在结果中,每一行增加一列表示是否有子节点 点击+ 在根据传递进去的当前节点作为加载子节点的parentunitcode,加载出子节点
这个直接用java实现把,这个用控件就可以了,一个一个加载上去,而且是有上下级关联的。先把顶层的家在上去,然后再加在子菜单
list<list<list<map>>>???前台怎么展示的,不能用json?
这个属于高级语言的范畴了,让 @中国风 给你移 到相应的版块吧;