【发布时间】:2014-05-25 09:18:28
【问题描述】:
我有一个文件夹平面树。该树具有以下属性:id、parent_id、name。
我将这棵树存储在一个简单的数组中。问题是这个数组没有排序。
我的数组的一个元素是这样的简单对象:
var obj = { id: 1, parent_id: null, name: "Folder" }
我想对它进行排序,以便能够看到这样的东西:
Folder1
Sub_folder1
Sub_sub_folder1
Sub_folder2
Sub_sub_folder2
还有一个……我不想使用递归,也不知道如何正确使用。
这是我的一些尝试。我尝试添加一个人工字段,该字段将表示集合中每个文件夹的数量,但它不起作用。
var sort = function(list) {
var f_map = {};
var sorting_index = 1;
var tree = angular.copy(list);
for(var i = 0; i < tree.length; i++) {
var node = tree[i];
f_map[ node.id ]= { index: i, children: [] };
if (node.parent_id) {
f_map[ node.parent_id ].children.push( node.id );
};
var idx = 0;
var visited = {};
for(var key in f_map) {
var index = f_map[key].index;
var node = tree[index];
if (!visited[node.id]) {
node.nuid = idx++;
} else {
visited[node.id] = true;
};
if (f_map[key].children.length) {
var children = f_map[key].children;
for(var i = 0; i < children.length; i++) {
var child_id = children[i];
var child_idx = f_map[child_id].index;
var child = tree[child_idx];
child.nuid = idx++;
visited[child.id] = true;
};
};
};
tree.sort(function(left, right) {
return left.nuid - right.nuid;
});
return tree;
};
【问题讨论】:
-
请在代码示例中添加您尝试过的内容。很乐意帮助您遇到困难,但不会为您解决。另外,如果你不知道怎么做,那你为什么选择退出递归呢?
-
@Ronni Skansing,完成。不想使用递归,因为这样做会让一切变慢。
-
你的阵列是什么样的?要对树结构进行排序,您可以按节点的路径排序、使用递归或使用堆栈(即手动实现递归)。
-
@thebjorn 添加了对我的数组元素的小描述。不知道如何正确使用堆栈。你有例子吗?
-
递归可能比您认为的要快得多 - 不要假设它不能满足您的速度要求。
标签: javascript arrays algorithm sorting