我有以下JSON示例来表示树。
[
{
"label": "node1",
"children": [
{
"label": "Human"
},
{
"label": "Chimpanzee"
}
]
},
{
"label": "node2",
"children": [
{
"label": "node3",
"children": [
{
"label": "Rat"
},
{
"label": "Mouse"
}
]
},
{
"label": "BigRat"
}
]
}
]
我现在想做的是以下内容: 给定标签列表(例如BigRat,Mouse),如何删除JSON中的相应节点?
我无法理解这一点。
非常感谢任何帮助!
由于
答案 0 :(得分:3)
由于您的树本质上是一个对象数组,其中每个对象都有一个标签和一个可选的子数组,您需要修剪的是数组元素,无论是在主树数组中还是在其中一个分支中。
您绝对不希望使用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;
}
}
}
}
现在假设您的树被称为tree
并且您想要修剪的标签是node3
,您可以像这样调用修剪:
var wasItPruned = prune(tree, "node3");