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

时间:2013-07-31 07:59:02

标签: javascript d3.js

我有以下JSON示例来表示树。

[
    {
        "label": "node1",
        "children": [
            {
                "label": "Human"
            },
            {
                "label": "Chimpanzee"
            }
        ]
    },
    {
        "label": "node2",
        "children": [
            {
                "label": "node3",
                "children": [
                    {
                        "label": "Rat"
                    },
                    {
                        "label": "Mouse"
                    }
                ]
            },
            {
                "label": "BigRat"
            }
        ]
    }
]

我现在想做的是以下内容: 给定标签列表(例如BigRat,Mouse),如何删除JSON中的相应节点?

我无法理解这一点。

非常感谢任何帮助!

由于

1 个答案:

答案 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");