【发布时间】:2017-03-25 09:49:25
【问题描述】:
我以flat tree 的形式从服务器获取数据。然后我将构建树的数据JsTree 库传输给我。
在传输数据JsTree 之前,我过滤数据并删除没有子级的folder 类型的空元素。
这是我得到的一些代码:
dataFilter: function (jsonString) {
function getItemList(item, list) {
if (item === null) {
return null;
}
if (item.parent === "#" && item.type !== "folder") {
return item;
} else {
if (item.type === "folder") {
var itemFolder = _.findWhere(list, { parent: item.id });
if (itemFolder) {
return item;
}
} else {
return item;
}
}
return null;
};
function removeEmptyFolder(list) {
console.log(list);
var treeListTemp = [];
for (var i = 0; i < list.length; i++) {
treeListTemp.push(getItemList(list[i], list));
}
var treeList = [];
for (var j = 0; j < treeListTemp.length; j++) {
var k = getItemList(treeListTemp[j], treeListTemp);
if (k === null) {
removeEmptyFolder(_.filter(treeListTemp,
function(item) {
return item !== null;
}));
} else {
treeList.push(k);
}
}
//console.log(treeList);
return treeList;
};
return JSON.stringify(_.filter(removeEmptyFolder(JSON.parse(jsonString)),
function (item) {
return item !== null;
}));
}
这是一个工作示例https://jsfiddle.net/nkqgot2a/11/
这段代码几乎可以正常工作。但如果最后一个元素包含一个子元素,则不会将其从列表中删除。数据过滤后,元素“文件夹 9”不应出现在列表中。
请告诉我如何修复我的功能以删除所有空文件夹?
在我看来,递归是由过多的时间引起的。
【问题讨论】:
-
"folder 9"有有孩子。"folder 12"的父级是"38",即"folder 9"。它不是空的,所以它没有被删除。 -
@Cerbrus 在第一次函数调用之后
removeEmptyFolder删除了元素"folder 11"。第二次调用函数后通过递归发生"folder 12"元素移除。第三次调用该函数时,项目"folder 9"不包含子项。 -
因为
folder 9是一个文件夹并且有父#并且根据您的条件if (item.parent === "#" && item.type !== "folder") { return item; }它的返回项目。问题只发生在那些位于根目录并且是 emply 的文件夹上
标签: javascript jquery json recursion underscore.js