1

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

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

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

我只是无法理解这一点。

任何帮助深表感谢!

谢谢

4

1 回答 1

9

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

您绝对不想使用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,你会像这样调用 prune :

var wasItPruned = prune(tree, "node3");
于 2013-07-31T11:23:06.627 回答