从很早就对各种命令行中输出的特殊样式感兴趣,最常见的就是 tree.
例如在某个目录执行 tree 命令,显示如下树图:
F:.
└─tk
└─mybatis
├─mapper
│ ├─annotation
│ ├─code
│ ├─common
│ │ ├─base
│ │ │ ├─delete
│ │ │ ├─insert
│ │ │ ├─select
│ │ │ └─update
│ │ ├─condition
│ │ ├─example
│ │ ├─ids
│ │ ├─rowbounds
│ │ ├─special
│ │ └─sqlserver
│ ├─entity
│ ├─generator
│ ├─mapperhelper
│ ├─provider
│ │ └─base
│ └─util
└─spring
└─mapper
这里使用JS简单实现上面的效果:
var PREFIX_BRANCH = '├─';//树枝
var PREFIX_TRUNK = '│ ';//树干
var PREFIX_LEAF = '└─';//叶子
var PREFIX_EMP = ' ';//空
function tree(nodes, prefix){
if(prefix == undefined){
prefix = '';
} else {
prefix = prefix.replace(PREFIX_BRANCH, PREFIX_TRUNK);
prefix = prefix.replace(PREFIX_LEAF, PREFIX_EMP);
}
for(var i = 0; i < nodes.length; i++){
//最后一个是叶子
if(i == nodes.length - 1){
console.log(prefix + PREFIX_LEAF + nodes[i].text);
if(('children' in nodes[i])
&& nodes[i].children != undefined
&& nodes[i].children.length > 0){
tree(nodes[i].children, prefix + PREFIX_LEAF);
}
}
//树枝
else {
console.log(prefix + PREFIX_BRANCH + nodes[i].text);
if(('children' in nodes[i])
&& nodes[i].children != undefined
&& nodes[i].children.length > 0){
tree(nodes[i].children, prefix + PREFIX_TRUNK);
}
}
}
}
测试:
var treeData = [
{
text: '树根',
children: [
{
text:'树枝',
children: [
{
text:'叶子',
children: [
{
text:'叶子'
}
]
}
]
},{
text:'叶子'
}
]
},{
text: '树根',
children: [
{
text:'树枝'
},{
text:'叶子'
}
]
}
];
tree(treeData);
输出结果:
├─树根
│ ├─树枝
│ │ └─叶子
│ │ └─叶子
│ └─叶子
└─树根
├─树枝
└─叶子
应用到具体数组时,主要是对下面代码进行修改:
if(('children' in nodes[i])
&& nodes[i].children != undefined
&& nodes[i].children.length > 0){
tree(nodes[i].children, prefix + PREFIX_TRUNK);
}
判断当前节点是否有子节点(或者是否包含子文件),如果包含,就获得所有子节点去循环。