我有以下 JSON 示例来表示一棵树。
[
{
"label": "node1",
"children": [
{
"label": "Human"
},
{
"label": "Chimpanzee"
}
]
},
{
"label": "node2",
"children": [
{
"label": "node3",
"children": [
{
"label": "Rat"
},
{
"label": "Mouse"
}
]
},
{
"label": "BigRat"
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
我现在想做的是:给定一个标签列表(例如 BigRat、Mouse),我如何删除 JSON 中的相应节点?
我就是无法理解这一点。
任何帮助深表感谢!
谢谢
由于您的树本质上是一个对象数组,其中每个对象都有一个标签和一个可选的子数组,您需要修剪的是数组元素,无论是在主树数组中还是在它的一个分支中。
您绝对不想使用delete删除数组元素,因为这会给您留下一个稀疏数组。相反,您应该splice删除数组元素。
另一方面,您应该使用delete删除对象属性,例如children一旦它们为空。这是我将使用的代码:
function prune(array, label) {
for (var i = 0; i < array.length; ++i) {
var obj = array[i];
if (obj.label === label) {
// splice out 1 element starting at position i
array.splice(i, 1);
return true;
}
if (obj.children) {
if (prune(obj.children, label)) {
if (obj.children.length === 0) {
// delete children property when empty
delete obj.children;
// or, to delete this parent altogether
// as a result of it having no more children
// do this instead
array.splice(i, 1);
}
return true;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在假设你的树被调用tree并且你想要修剪的标签是node3,你会像这样调用 prune :
var wasItPruned = prune(tree, "node3");
Run Code Online (Sandbox Code Playgroud)