我目前有一个深度未知的嵌套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”图层,因为对象通常具有我不希望作为树的一部分进行搜索的子对象。元素是通过
搜索的对象答案 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.name
与name
完全匹配,则调用单独的函数prune_tree
,并将保存的parent
元素和当前子元素{{1}传递给它}}
在element
内,只需遍历prune_tree
的键,直到找到您正在寻找的孩子parent
。然后element
离开父母。
这里应该没有任何意外,这个特定的功能集可能会继续运行,直到每个分支上的每个节点都被访问过......所以如果你有更多,比方说,2000个节点,您可能需要考虑将其分解为块,否则它将打破某些浏览器的调用堆栈。 假设您只有1000个或更少的节点,或者您只是针对具有更大堆栈的浏览器,那么这应该修剪所有具有相同名称的节点。
同样,这一切都归结为这是否是你的预期结果,或者你是否依赖于获得返回值,与它们做某事,或者如果你只是希望解雇它,将它传递给树的根,并期望该功能净化分支。
我也不确定你是否想要对修剪过的物体做些什么,或者是否只是要让一棵树从名为“name”的暴政中清除。