Получаю данные с сервера в формате 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» не должен появляться в списке после фильтрации данных.
Скажите, пожалуйста, как исправить мою функцию, чтобы удалить все пустые папки?
Как мне кажется, рекурсия вызвана чрезмерным количеством времени.
' "папка 9"' ___does___ имеют детей. родительская папка "12" '' '' 38 "', которая является '' папкой 9 "'. Он не пуст, поэтому он не удаляется. – Cerbrus
@Cerbrus После первого вызова функции 'removeEmptyFolder' удаляет элемент' 'folder 11" '. После второго вызова функции через рекурсию происходит '' folder 12 "' удаление элемента. Когда функция вызывается в третий раз, папка '' 9 "' элемента не содержит дочерних элементов. –
Потому что 'folder 9' является папкой и имеет родительский' # 'и в соответствии с вашим условием' if (item.parent === "#" && item.type! == "folder") { return item; } 'его возвращающийся товар. проблема происходит только с той папкой, которая находится в корне и используется –