删除阵列中没有子项的所有元素
问题描述:
我以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”不应出现在列表中。
请告诉我如何解决我的功能,因此,它会删除所有空文件夹?
由于尚未在我看来,该递推通过的时间过多而引起的。
答
检查我对此非常
var data = [{
"id": "15",
"parent": "#",
"title": "folder 1",
"type": "folder"
}, {
"id": "16",
"parent": "15",
"title": "file 2",
"type": "file"
}, {
"id": "21",
"parent": "25",
"title": "file 6",
"type": "file"
}, {
"id": "25",
"parent": "15",
"title": "folder 10",
"type": "folder"
}, {
"id": "33",
"parent": "#",
"title": "folder 3",
"type": "folder"
}, {
"id": "34",
"parent": "33",
"title": "folder 4",
"type": "folder"
}, {
"id": "35",
"parent": "25",
"title": "file 5",
"type": "file"
}, {
"id": "36",
"parent": "#",
"title": "file 7",
"type": "file"
}, {
"id": "37",
"parent": "#",
"title": "folder 8",
"type": "folder"
}, {
"id": "38",
"parent": "#",
"title": "folder 9",
"type": "folder"
}, {
"id": "39",
"parent": "40",
"title": "folder 11",
"type": "folder"
}, {
"id": "40",
"parent": "38",
"title": "folder 12",
"type": "folder"
}];
function dataFilter(jsonString) {
function getItemList(item, list) {
if (item) {
if (item.type === "folder") {
var itemFolder = _.findWhere(list, {
parent: item.id
});
if (itemFolder) {
return item;
}
} else {
return item;
}
}
return null;
};
function removeEmptyFolder(list) {
var tempItem = null;
var i;
for (i = 0; i < list.length; i++) {
tempItem = getItemList(list[i], list);
if (tempItem == null) {
break;
}
}
if (tempItem == null) {
if (_.size(list) > 0) {
list.splice(i, 1);
removeEmptyFolder(list);
}
}
return list;
};
return removeEmptyFolder(jsonString);
}
$(document).ready(function() {
var $beforelist = $('#before_json');
$.each(data, function() {
$('<li>' + this.title + '</li>').appendTo($beforelist);
});
var $afterlist = $('#after_json');
$.each(dataFilter(data), function() {
$('<li>' + this.title + '</li>').appendTo($afterlist);
});
});
<pre id="before_json"></pre>
<p>After:</p>
<pre id="after_json"></pre>
<script src="https://code.jquery.com/jquery-3.1.1.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
' “文件夹9”'___does___有孩子做了很多的变化。 ''文件夹12“'的父母是''38”',它是''文件夹9“'。它不是空的,所以它不会被删除。 – Cerbrus
@Cerbrus在第一个函数调用'removeEmptyFolder'移除元素''文件夹11“'后。第二次调用函数通过递归发生''文件夹12“'元素移除。当第三次调用该函数时,文件夹“9”没有包含子项。 –
由于'文件夹9'是一个文件夹,并有父''',并根据您的条件'if(item.parent ===“#”&& item.type!==“文件夹”){ return item; }它的返回项目。问题只发生在那些位于根目录的文件夹中 –