1

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

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

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

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”的子对象,其中将存储任意数量的其他对象。我添加了额外的“子”层,因为这些对象通常具有我不想作为树的一部分搜索的子对象。元素是被搜索的对象

4

1 回答 1

2

您是否要从树中移除对象?这就是你想要做的一切?

如果是这样,则将树的“父”节点存储在搜索中。编写第二个函数——也许prune_tree是 ,在其中传入父对象和对象(或具有两者作为属性的对象),然后执行 for ... 搜索父对象。如果 parent[key] === 对象,删除 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% 确定你在递归时实际上在做什么(比如你是否依赖于特定的返回值,或者其他什么......我什至不知道是否有多个对象可能在不同的分支上具有相同的名称——包括根节点)。

但是像我在那里的东西应该递归你的树。它设置parentelement.children(存储孩子的地方),然后循环遍历孩子中的每个对象以再次调用该函数,并传入parent下一组。So elementis 将成为一个子元素,并将parent成为children持有它的对象。

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

在 的内部prune_tree,只需遍历 的键parent,直到找到您要寻找的孩子element。然后delete它关闭了父母。

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

同样,这一切都归结为这是否是您的预期结果,或者您是否依赖于获取返回值,对它们做一些事情,或者如果您只是希望触发它,将它传递给树的根,并期望净化树枝的功能。

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

于 2012-09-12T04:40:43.930 回答