Javascript 如何删除/删减不存在于单独数组中的所有树节点

Javascript 如何删除/删减不存在于单独数组中的所有树节点,javascript,arrays,json,Javascript,Arrays,Json,我有以下JSON树表示: let tree = [ { "label": "Org01", "children": [ { "label": "Dist01", "children": [ { "label": "School1", "childr

我有以下JSON树表示:

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;
}