Javascript 如何删除/删减不存在于单独数组中的所有树节点
我有以下JSON树表示:Javascript 如何删除/删减不存在于单独数组中的所有树节点,javascript,arrays,json,Javascript,Arrays,Json,我有以下JSON树表示: let tree = [ { "label": "Org01", "children": [ { "label": "Dist01", "children": [ { "label": "School1", "childr
let tree = [
{
"label": "Org01",
"children": [
{
"label": "Dist01",
"children": [
{
"label": "School1",
"children": [
{
"label": "class1",
"children": []
},
{
"label": "class2",
"children": []
}
]
},
{
"label": "School1tst",
"children": []
}
]
},
{
"label": "Dist02",
"children": []
}
]
},
{
"label": "contoso01",
"children": [
{
"label": "Dist A",
"children": [
{
"label": "School A",
"children": [
{
"label": "classA",
"children": []
}
]
},
{
"label": "School B",
"children": [
{
"label": "classB",
"children": []
}
]
}
]
},
{
"label": "Dist B",
"children": [
{
"label": "School1",
"children": [
{
"label": "class1",
"children": []
}
]
}
]
}
]
}
];
我有一个数组中的节点列表,如下所示:
let whitelist = ['class1', 'School1', 'Dist01'];
如何从树中删除上述数组中不存在的所有节点。但是,如果父节点的子节点在白名单中,则需要在树上显示父节点
从树中删除特定节点对我来说是可能的,但我无法找到一种方法来删除树中的所有节点,除了数组中的少数节点
所需的最终输出:
output = [
{
"label": "razor01",
"children": [
{
"label": "Dist01",
"children": [
{
"label": "School1",
"children": [
{
"label": "class1",
"children": []
}
]
}
]
}
]
},
{
"label": "contoso01",
"children": [
{
"label": "Dist B",
"children": [
{
"label": "School1",
"children": [
{
"label": "class1",
"children": []
}
]
}
]
}
]
}];
谢谢你,我非常感谢你对我的帮助。我是这样解决的:
function deleteNodes(tree, list) {
if (tree.length > 0) {
tree.forEach((node, i) => {
this.deleteNodes(node.subItems, list);
if (node.subItems) {
if (node.subItems.length === 0 && !list.includes(node.text))
{
tree.splice(i, 1);
}
}
});
}
}
这应该可以完成工作:
function filter(tree, list){
let output = [];
for(i in tree){
if(list.indexOf(tree[i].label) >= 0){
tree[i].children = filter(tree[i].children, list);
output.push(tree[i]);
}else{
output = output.concat(filter(tree[i].children, list));
}
}
return output;
}
您能告诉我们您尝试了什么吗?您的外部对象的标签不在白名单中。你想要返回一个空列表吗?@Viney,我已经在下面发布了我尝试过的代码。您能检查一下我的解决方案吗,但它似乎不正确。@MarkMeyer我需要父节点,如果它们的子节点的标签在白名单中,则需要在树上显示。因此
“label”:“Dist B”
不在白名单中,但它有一个带有“label”:“School1”
。那么您想在最终输出中使用contoso01
和Dist B
?如果您编辑问题以显示所需的输出,可能会更清楚。
function filter(tree, list){
let output = [];
for(i in tree){
if(list.indexOf(tree[i].label) >= 0){
tree[i].children = filter(tree[i].children, list);
output.push(tree[i]);
}else{
output = output.concat(filter(tree[i].children, list));
}
}
return output;
}