从对象中删除属性而不知道深度或父属性

时间:2012-09-12 04:31:00

标签: javascript object nested

我目前有一个深度未知的嵌套javascript对象。该对象是纯动态生成的,所以我不知道我要删除的属性的父对象的名称(我可以修改一些东西来获取它们,如果我有,但我试图避免这种情况。)< / p>

我目前有一个名为search_tree(name)的函数,它搜索对象的所有属性,直到找到属性 name : "name" ,然后返回该对象,以便在树的该位置添加数据。 / p>

但是,我现在需要从树中删除该对象,并且还没有让它工作。我试过了:

obj = search_tree(name);
delete obj;

这不起作用,我假设因为obj实际上不是树中的对象,而是对它的引用?

delete search_tree(name);

也没有结果。这可以通过这种方式完成,还是我需要改变search_tree函数以某种方式返回遗产(或者只是做一个不同的遗产)?感谢

来自search_tree的代码

function search_tree(element, matchingName){
     if(element.name == matchingName){
          return element;
      }else if (element.children != null){
            var result = null;
            for(var child in element.children){
                 result = searchTree(element.children[child], matchingName);
            }
            return result;
      } else {
            return null;
      }
}

刚刚意识到这个功能可能有点不清楚,没有解释。树中的每个对象都有一个名为“children”的子对象,其中将存储任意数量的其他对象。我添加了额外的“children”图层,因为对象通常具有我不希望作为树的一部分进行搜索的子对象。元素是通过

搜索的对象

1 个答案:

答案 0 :(得分:2)

您是否希望从树中删除对象?这就是你要做的一切吗?

如果是,则将树的“父”节点存储在搜索中。 编写第二个函数 - 也许prune_tree,传入父对象和对象(或两个作为属性的对象),然后执行for ...搜索parent。如果parent [key] === object,则删除parent [key];

现在,您有一个完整的树,其中该特定父级不再包含该对象(或者您应该)。

鉴于search_tree应该是递归的,再给它一个参数(parent),你可以为你所达到的每个深度级别提供一次参数(每个孩子将拥有相同的父级)。一定要考虑父作为根(因此没有父母)。 当您找到要杀死的对象时,return { object : objectNode, parent : parentNode };

将它放入你的修剪功能。 对parentNode的引用意味着当您删除parentNode.objectNode时,它将从树中删除 (因为它只是一个引用,毕竟)。

修改

基于以上所述:

function prune_tree (parent, child) {
    var key = "";
    for (key in parent) { if (parent.hasOwnProperty(key) && parent[key] === child) {
        delete parent[key];
    }
}


function search_tree (name, element, parent) {
    var key = "";
    if (element.name === name) {
        return prune_tree(parent, element);
    } else if (!element.children) {
        return null;
    } else {
        parent = element.children;
        for (key in children) { if (children.hasOwnProperty(key) {
            return search_tree(name, children[key], parent);
        }}
    }
}

我不是100%肯定你在递归时你实际在做什么(比如你是否依赖于特定的回报值,或者其他什么......我甚至不知道是否有多个在不同的分支上可能具有相同名称的对象 - 包括根节点。)

但是像我在那里的东西应该递归你的树。 它将parent设置为element.children(存储子项的位置),然后循环遍历子项中的每个对象以再次调用该函数,将parent传递到下一组。因此element将成为子元素,而parent将成为持有它的children对象。

如果element.namename完全匹配,则调用单独的函数prune_tree,并将保存的parent元素和当前子元素{{1}传递给它}}

element内,只需遍历prune_tree的键,直到找到您正在寻找的孩子parent。然后element离开父母。

这里应该没有任何意外,这个特定的功能集可能会继续运行,直到每个分支上的每个节点都被访问过......所以如果你有更多,比方说,2000个节点,您可能需要考虑将其分解为块,否则它将打破某些浏览器的调用堆栈。 假设您只有1000个或更少的节点,或者您只是针对具有更大堆栈的浏览器,那么这应该修剪所有具有相同名称的节点。

同样,这一切都归结为这是否是你的预期结果,或者你是否依赖于获得返回值,与它们做某事,或者如果你只是希望解雇它,将它传递给树的根,并期望该功能净化分支。

我也不确定你是否想要对修剪过的物体做些什么,或者是否只是要让一棵树从名为“name”的暴政中清除。