Javascript js从一维数组中删除相关项

Javascript js从一维数组中删除相关项,javascript,arrays,loops,recursion,hierarchical-data,Javascript,Arrays,Loops,Recursion,Hierarchical Data,我有一个对象数组,可能看起来像这样: {name: "A", parent: null}, {name: "B", parent: "A"}, {name: "C", parent: "B"}, {name: "D", parent: "B"}, {name: "E", parent: "A"}, 它位于树层次结构中

我有一个对象数组,可能看起来像这样:

{name: "A", parent: null},
{name: "B", parent: "A"},
{name: "C", parent: "B"},
{name: "D", parent: "B"},
{name: "E", parent: "A"},
它位于树层次结构中:

-A
    -B
        -C
        -D
    -E   
我试图从数组中删除名为的所有项,比如说B,这也应该删除它的子项,所以在这种情况下,项C和D,但是我对递归不熟悉,我自己也无法做到这一点,有人能告诉我一个最佳的方法吗

感谢所有愿意提前提供帮助的人

变量数组\u的\u对象=[ {name:A,parent:null}, {name:B,parent:A}, {name:C,parent:B}, {name:D,parent:B}, {name:E,parent:A}, ]; //返回具有更新值的数组。 函数delete元素,包括其子元素、子元素、原始数组{ 返回OriginalArray.FilterFunction元素{ //控制台日志元素 ifelement.name==children | | element.parent==children返回false; else返回元素; }; } console.logdeleteElement包括它的childrenb、数组\u和\u对象 变量数组\u的\u对象=[ {name:A,parent:null}, {name:B,parent:A}, {name:C,parent:B}, {name:D,parent:B}, {name:E,parent:A}, ]; //返回具有更新值的数组。 函数delete元素,包括其子元素、子元素、原始数组{ 返回OriginalArray.FilterFunction元素{ //控制台日志元素 ifelement.name==children | | element.parent==children返回false; else返回元素; }; } console.logdeleteElement包括它的childrenb,数组\u的\u对象解决此问题的一种方法:

对图形进行深度优先遍历,并记录/确定每个元素的祖先。如果您正在检查一个叶节点,并且它的祖先是B,或者它本身就是B,那么它必须离开

深度优先:每次看到子元素时,对所有子元素重复函数/算法。 叶节点:没有任何子节点的对象

如何建立亲子关系

在处理所有元素时,使用对象的名称作为字典键,将以前未见过的每个元素放入字典(也称为hashmap、set或JS中的普通对象)。当遇到具有给定父对象的对象时,只需检查字典中是否已有该对象,并将当前元素作为子元素添加

如果树非常大,这种方法可能会占用大量内存,因此您可能希望限制自己仅从子对象引用一个父对象,而不是每个父对象都指向它的所有子对象。

解决此问题的一种方法:

对图形进行深度优先遍历,并记录/确定每个元素的祖先。如果您正在检查一个叶节点,并且它的祖先是B,或者它本身就是B,那么它必须离开

深度优先:每次看到子元素时,对所有子元素重复函数/算法。 叶节点:没有任何子节点的对象

如何建立亲子关系

在处理所有元素时,使用对象的名称作为字典键,将以前未见过的每个元素放入字典(也称为hashmap、set或JS中的普通对象)。当遇到具有给定父对象的对象时,只需检查字典中是否已有该对象,并将当前元素作为子元素添加

如果树非常大,这种方法可能会占用大量内存,因此您可能希望将自己限制为仅从子对象引用一个父对象,而不是每个父对象都指向其所有子对象。

如何删除所有嵌套的子对象 功能删除所有obj、arr{ 函数DeleteNode obj{ 让否=[]; forlet i=0;i0{ DeleteNodeno,arr } } 删除节点bj 返回arr; } //问题: const arr=[{name:A,parent:null}, {name:B,parent:A}, {name:C,parent:B}, {name:D,parent:B}, {name:E,parent:A}]; console.logdeleteAll[B],arr如何删除所有嵌套子级 功能删除所有obj、arr{ 函数DeleteNode obj{ 让否=[]; forlet i=0;i0{ DeleteNodeno,arr } } 删除节点bj 返回arr; } //问题: const arr=[{name:A,parent:null}, {name:B,parent:A}, {name:C,parent:B}, {name:D,parent:B}, {name:E,parent:A}];
console.logdeleteAll[B],arr编写此命令的一种方法是将其放在另一个函数的顶部,该函数收集捕获子体层次结构的节点列表。这是一个简单的递归,然后主函数只是一个过滤:

const desc=target,xs,node=xs.find{n ame}=>name==target=>node?[ 节点, …xs.filter{parent}=>parent==node.name.flatMap{name}=>desc name,xs ] : [] const removeHier=target,xs,h=desc-target,xs=> 过滤器x=>!h、 包括x const records=[{name:A,parent:null},{name:B,parent:A},{name:C,parent:B},{name:D,parent:B},{name:E,parent:A},{name:F,parent:D}]
log removeHier'B',records写这篇文章的一种方法是将它放在另一个函数之上,该函数收集捕获子体层次结构的节点列表。这是一个简单的递归,然后主函数只是一个过滤:

const desc=target,xs,node=xs.find{name}=>name==target=>node?[ 节点, …xs.filter{parent}=>parent==node.name.flatMap{name}=>desc name,xs ] : [] const removeHier=target,xs,h=desc-target,xs=> 过滤器x=>!h、 包括x const records=[{name:A,parent:null},{name:B,parent:A},{name:C,parent:B},{name:D,parent:B},{name:E,parent:A},{name:F,parent:D}]
console.log removeHier'B',Records您只需使用forEach@Goubermouche,这是一个相关的,它是如何呈现的?使用delete object.property,如果它是嵌套对象,它将删除该属性,然后再删除该对象too@evolutionxbox还没有渲染呢,,我只是想删除一个项目和它的所有子项目。你可以使用forEach@Goubermouche,这是一个相关的,它是如何呈现的?使用delete object.property,如果它是嵌套对象,它将删除该属性,然后再删除该对象too@evolutionxbox还没有渲染呢,,我只是想删除一个项目和它的所有子项目。这个功能很好,但它看起来只有两个级别-因此,如果我们以我发送的数组为例,它似乎可以工作,但是,例如,当我尝试删除名为A的项目时,它会删除前两个级别内的所有内容,因此C和D仍然保留在数组中。有没有办法解决这个问题?这个函数很好用,但是看起来只有两层深——因此,如果我们以我发送的数组为例,它似乎可以工作,但是,例如,当我尝试删除名为a的项时,它会删除前两层中的所有内容,因此C和D仍然保留在数组中。有没有办法绕过这个问题?问题是删除一个分支,而不仅仅是构建图表。但我想这是一个开始,删除分支而不构建整个图形非常容易。请看这里的一些其他答案。非常抱歉,我误解了这个问题,现在我更新了答案,请查看..这个问题是关于删除分支,而不仅仅是构建图表。但我想这是一个开始,删除分支而不构建整个图形非常容易。请看这里的其他一些答案。非常抱歉,我误解了这个问题,现在我已经更新了答案,请复习。。