我正在尝试根据对象的某些子项的“大小”键的值为0来删除它们。
我正在使用npm软件包directory-tree来获取表示所选目录的javascript对象。
对象看起来像这样:
{
"path": "directory",
"name": "directory",
"children": [
{
"path": "directory\\file1.html",
"name": "file1.html",
"size": 147,
"extension": ".html",
"type": "file"
},
{
"path": "directory\\file2.htm",
"name": "file2.htm",
"size": 147,
"extension": ".htm",
"type": "file"
},
{
"path": "directory\\file3.php",
"name": "file3.php",
"size": 147,
"extension": ".php",
"type": "file"
},
{
"path": "directory\\subdirectory-1",
"name": "subdirectory-1",
"children": [],
"size": 0,
"type": "directory"
},
{
"path": "directory\\subdirectory-2",
"name": "subdirectory-2",
"children": [
{
"path": "directory\\subdirectory-2\\subfile1.html",
"name": "subfile1.html",
"size": 147,
"extension": ".html",
"type": "file"
},
{
"path": "directory\\subdirectory-2\\subfile2.htm",
"name": "subfile2.htm",
"size": 147,
"extension": ".htm",
"type": "file"
}
],
"size": 294,
"type": "directory"
},
{
"path": "directory\\subdirectory-3",
"name": "subdirectory-3",
"children": [
{
"path": "directory\\subdirectory-3\\sub-subdirectory",
"name": "sub-subdirectory",
"children": [],
"size": 0,
"type": "directory"
},
{
"path": "directory\\subdirectory-3\\subfile3.php",
"name": "subfile3.php",
"size": 147,
"extension": ".php",
"type": "file"
},
{
"path": "directory\\subdirectory-3\\subfile4.html",
"name": "subfile4.html",
"size": 147,
"extension": ".html",
"type": "file"
}
],
"size": 294,
"type": "directory"
}
],
"size": 1029,
"type": "directory"
}
现在,我正在尝试删除每个递归大小为0的目录。
我尝试使用自调用函数遍历子对象:
function filterObject(obj){
for(i=0; i<obj.children.length; i++){
if(obj.children[i].type == "directory"){
if(obj.children[i].size == 0){
delete obj.children[i]
}
else {
filterObject(obj.children[i])
}
}
}
}
但是我遇到一个错误:
renderer.js:22未捕获的TypeError:无法读取未定义的属性'type'
当我更改代码以便检查每个孩子本身是否是对象时
if(typeof obj.children[i] === 'object' && obj.children[i].type == "directory"){...}
我正在引起一些循环问题,并且浏览器冻结(必须重新启动)。
答案 0 :(得分:0)
您可以过滤项目并更改嵌套子项的对象。
function removeZero(o) {
if (o.size === 0) return false;
if (o.children) o.children = o.children.filter(removeZero);
return true;
}
var data = { path: "directory", name: "directory", children: [{ path: "directory\file1.html", name: "file1.html", size: 147, extension: ".html", type: "file" }, { path: "directory\file2.htm", name: "file2.htm", size: 147, extension: ".htm", type: "file" }, { path: "directory\file3.php", name: "file3.php", size: 147, extension: ".php", type: "file" }, { path: "directory\\subdirectory-1", name: "subdirectory-1", children: [], size: 0, type: "directory" }, { path: "directory\\subdirectory-2", name: "subdirectory-2", children: [{ path: "directory\\subdirectory-2\\subfile1.html", name: "subfile1.html", size: 147, extension: ".html", type: "file" }, { path: "directory\\subdirectory-2\\subfile2.htm", name: "subfile2.htm", size: 147, extension: ".htm", type: "file" }], size: 294, type: "directory" }, { path: "directory\\subdirectory-3", name: "subdirectory-3", children: [{ path: "directory\\subdirectory-3\\sub-subdirectory", name: "sub-subdirectory", children: [], size: 0, type: "directory" }, { path: "directory\\subdirectory-3\\subfile3.php", name: "subfile3.php", size: 147, extension: ".php", type: "file" }, { path: "directory\\subdirectory-3\\subfile4.html", name: "subfile4.html", size: 147, extension: ".html", type: "file" }], size: 294, type: "directory" }], size: 1029, type: "directory" };
data.children = data.children.filter(removeZero);
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }