从具有n-ary树结构的数组中删除元素

时间:2014-05-29 06:46:45

标签: javascript jquery

我有一个如下数组:

    var data= 
    [
    {"id":"root1","name":"root1","childNodes":
            [
            {"id":"child1_root1","name":"child1_root1","childNodes":
                [
                {"id":"child1of_child1_root1","name":"child1of_child1_root1"}
                ]
            },
            {"id":"child2_root1","name":"child2_root1","childNodes":[]}
            ]
    },

    {"id":"root2","name":"root2","childNodes":
        [
        {"id":"child1root2","name":"child1root2"}
        ]
    },

    {"id":"root3","name":"root3","childNodes":
        [
        {"id":"child1root3","name":"child1root3"}
        ]
    }
    ]

现在我要删除一个带有一些id的节点。如果节点有一些子节点,那么它们也应该从数组中删除。

假设我有一系列要删除的id节点:

var nodestobe_removed=["child1_root1","child1root2"];

在第一个节点中有一个子节点,因此节点及其子节点都将被删除。

第二个节点没有子节点,因此只删除此节点。

有没有一种简单的方法可以在 JQuery 中执行此操作,而不是循环遍历数组中的每个节点?

这是link to try。使用控制台查看结果。

1 个答案:

答案 0 :(得分:1)

您可以使用inArray()splice()我想...如果您希望能够避免循环:

var data = data.splice(jQuery.inArray(nodestobe_removed[0], data), 1);

这假设您确定nodestobe_removed中的值位于data

但是真的......循环是... ...的主要功能 ... ...编程和东西。

如果您执行以下操作,您的代码会更灵活:

//ECMAScript 5.1+

data.forEach(function(element, index, arr) {
    for(var key in element.keys())
    {
        if(jQuery.inArray(key, nodestobe_removed) != -1)
        { 
            data.splice(index, 1); 
        }
    }
});

这样,如果您的数组内容将来发生变化,则无需更新代码。