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;iconsole.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仍然保留在数组中。有没有办法绕过这个问题?问题是删除一个分支,而不仅仅是构建图表。但我想这是一个开始,删除分支而不构建整个图形非常容易。请看这里的一些其他答案。非常抱歉,我误解了这个问题,现在我更新了答案,请查看..这个问题是关于删除分支,而不仅仅是构建图表。但我想这是一个开始,删除分支而不构建整个图形非常容易。请看这里的其他一些答案。非常抱歉,我误解了这个问题,现在我已经更新了答案,请复习。。