Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何修剪/删除嵌套/树状JSON中的节点?_Javascript_D3.js - Fatal编程技术网

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

Javascript 如何修剪/删除嵌套/树状JSON中的节点?,javascript,d3.js,Javascript,D3.js,我有下面的JSON示例来表示一棵树 [ { "label": "node1", "children": [ { "label": "Human" }, { "label": "Chimpanzee" } ] }, { "label": "node2",

我有下面的JSON示例来表示一棵树

[
    {
        "label": "node1",
        "children": [
            {
                "label": "Human"
            },
            {
                "label": "Chimpanzee"
            }
        ]
    },
    {
        "label": "node2",
        "children": [
            {
                "label": "node3",
                "children": [
                    {
                        "label": "Rat"
                    },
                    {
                        "label": "Mouse"
                    }
                ]
            },
            {
                "label": "BigRat"
            }
        ]
    }
]
我现在想做的是: 给定一个标签列表(例如BigRat、Mouse),如何删除JSON中的相应节点

我就是想不起来

非常感谢您的帮助


谢谢

因为树本质上是一个对象数组,其中每个对象都有一个标签和一个可选的子数组,所以需要修剪的是主树数组或它的一个分支中的数组元素

您肯定不想使用
delete
删除数组元素,因为这样会留下稀疏数组。相反,您应该将拼接出数组元素

另一方面,您应该使用
delete
来删除对象属性,例如
子对象
一旦为空。以下是我将使用的代码:

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

为..使用
。。在
循环或
对象中。使用普通循环键
迭代对象的元素,使用普通for循环键迭代数组。通过使用
delete
从对象中删除元素,或者通过使用splice从数组中将元素设置为null。我假设在执行此操作时,您没有处理JSON(一种文本序列化形式),而是内存中的对象图?您可能希望删除节点的可视化,而不是更改JSON本身。。。因此,显示你的D3.js脚本将帮助我们帮助你。另一方面,如果你真的想编辑你的JSON,这与D3.js无关,所以你应该为每个人清除它……它是有效的,但是你如何删除内部节点呢。如果删除了两个叶节点,则还需要删除相应的父节点。请编辑代码以演示由于没有更多子节点而删除父节点的替代方案。谢谢
var wasItPruned = prune(tree, "node3");