Javascript 将列表转换为嵌套对象树
我正在使用angular并希望在html中显示文件夹的嵌套树,如下所示:Javascript 将列表转换为嵌套对象树,javascript,angularjs,tree,treeview,Javascript,Angularjs,Tree,Treeview,我正在使用angular并希望在html中显示文件夹的嵌套树,如下所示: <div id="tree"> <ul> <li ng-repeat='folder in folderList' ng-include="'/templates/tree-renderer.html'" id="{{ folder.htmlId }}"> </li> </ul> </div> 并不是
<div id="tree">
<ul>
<li ng-repeat='folder in folderList' ng-include="'/templates/tree-renderer.html'" id="{{ folder.htmlId }}">
</li>
</ul>
</div>
并不是说列表不需要排序。
正如您在html中看到的,我现在需要将此列表转换为以下列表:
{
"key": "folder1",
"children": [{
"key": "folder1/subFolder1"
}, {
"key": "folder1/subFolder2"
}]
},{
"key": "folder2",
"children": [{
"key": "folder2/subFolder1",
"children": [{
"key": "folder2/subFolder1/subSubFolder2"
}]
}]
}
现在我需要两个递归函数来实现这一点,一个用于创建子数组,另一个用于将这些数组放入一个属性children中
我只想做一个,你对如何做有什么想法吗?基本上,从服务器端创建结构化列表比从客户端创建结构化列表更好 但在您的情况下,您需要为每个元素标识父元素(文件夹),并将它们放置在正确的项目中。所以你不需要递归 函数代码:(2个函数:结构化和呈现)
谢谢,对“有父亲”的条件进行了一些编辑,这正是我所需要的
{
"key": "folder1"
},
{
"key": "folder2"
},
{
"key": "folder1/subFolder1"
},
{
"key": "folder2/subFolder2"
},
{
"key": "folder1/subFolder2"
},
{
"key": "folder2/subFolder2/subSubFolder2"
}
{
"key": "folder1",
"children": [{
"key": "folder1/subFolder1"
}, {
"key": "folder1/subFolder2"
}]
},{
"key": "folder2",
"children": [{
"key": "folder2/subFolder1",
"children": [{
"key": "folder2/subFolder1/subSubFolder2"
}]
}]
}
var list = [{
key: 'folder1'
},{
key: 'folder2'
},{
key: "folder1/subFolder1"
},{
key: "folder2/subFolder2"
},{
key: "folder1/subFolder3"
},{
key: "folder2/subFolder2/subSubFolder2"
}];
$('body').ready(function(){
ord_list = construct_ord_list(list);
construct_html(ord_list);
});
var construct_ord_list = function(list){
var finished = false;
var running = true;
// Construct a list with a father property for each items
var res = [];
for(i in list)
res.push({ key: list[i].key, father: ''});
// Identifying fathers
while (!finished){
if (!running)
finished = true;
running = false;
for(i in res)
if(res[i].key.indexOf('/') > -1){
running = true;
// father recepts the left side of key value from '/'
res[i].father = res[i].key.substring(0,res[i].key.indexOf('/'));
// key recepts the right side of key value from '/'
res[i].key = res[i].key.substring(res[i].key.indexOf('/')+1,res[i].key.length);
}
}
return res;
}
var construct_html = function(list){
var text = '<ul>';
for(i in list)
if(list[i].father == '')
text += '<li id="item_'+list[i].key+'">'+list[i].key+'<ul class="children"></ul></li>';
$('body').append(text+'</ul>');
for(i in list)
if(list[i].father != '')
$('#item_'+list[i].father).find('.children').first().append('<li id="item_'+list[i].key+'">'+list[i].key+'<ul class="children"></ul></li>');
}
var construct_tree = function(list){
var res = [];
for(i in list)
if(list[i].father == '')
res.push({ key: list[i].key, children: []});
for(i in list)
if(list[i].father != '')
insert_child(res,list[i]);
return res;
}
var insert_child = function(list,elmt){
for(i in list)
if (list[i].key == elmt.father)
list[i].children.push({ key: list[i].key, children: []});
else if (list[i].children.length > 0)
insert_child(list[i].children,elmt);
}