如何修剪/删除嵌套/树状 JSON 中的节点?

fab*_*sta 1 javascript d3.js

我有以下 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 中的相应节点?

我就是无法理解这一点。

任何帮助深表感谢!

谢谢

Ray*_*din 8

由于您的树本质上是一个对象数组,其中每个对象都有一个标签和一个可选的子数组,您需要修剪的是数组元素,无论是在主树数组中还是在它的一个分支中。

您绝对不想使用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)