Javascript 使用递归从嵌套数组中删除子级

Javascript 使用递归从嵌套数组中删除子级,javascript,Javascript,我希望能够从具有子对象的对象数组中删除对象。我当时认为这是递归的工作,但我无法让递归函数正常工作。我想使用reduce来重建数据结构,而不需要删除对象。函数应该接受两个参数:嵌套对象数组和Id 我的要求是:删除节点和下面的所有子节点 乍一看,这似乎很容易,但我发现的挑战是删除一个子项并保持整个数据结构完好无损。通过基于id进行筛选来删除父级是很简单的,但是嵌套的子级会带来问题 我的数据结构如下所示: const data = [{ id: 'BFQEA1W2RK1YRETZ9343',

我希望能够从具有子对象的对象数组中删除对象。我当时认为这是递归的工作,但我无法让递归函数正常工作。我想使用reduce来重建数据结构,而不需要删除对象。函数应该接受两个参数:嵌套对象数组和Id

我的要求是:删除节点和下面的所有子节点

乍一看,这似乎很容易,但我发现的挑战是删除一个子项并保持整个数据结构完好无损。通过基于id进行筛选来删除父级是很简单的,但是嵌套的子级会带来问题

我的数据结构如下所示:

const data = [{
  id: 'BFQEA1W2RK1YRETZ9343',
  name: 'Cover',
  activityId: 'BFQEA1W2RK1YRETZ9343',
  nodeType: 'activity',
  suppressed: true,
  hidden: true
},
{
  children: [
    {
      id: 'ZNRAE749BSD0CTGHY888',
      name: 'Consultants, Reviewers, and National Geographic Exploration',
      activityId: 'ZNRAE749BSD0CTGHY888',
      nodeType: 'activity',
      suppressed: false,
      hidden: false
    },
    {
      id: 'JZLS37EVZQM22H9Q4655',
      name: 'The National Geographic Approach',
      activityId: 'JZLS37EVZQM22H9Q4655',
      nodeType: 'activity',
      suppressed: false,
      hidden: false
    },
  ]
}
]
 findNode = (id, arr) => {
    return arr.reduce((a, item) => {
      // if (item.id === id) {
      //   console.log('here');
      //   return item;
      // }
      if (item.id !== id) {
        a.push(item);
      }
      if (item.children) {
        return this.findNode(id, item.children);
      }
    }, []);
  };
如果我将此Id(ZNRAE749BSD0CTGHY888)传递给函数,我的预期数据结果应为:

const expected =  [{
  id: 'BFQEA1W2RK1YRETZ9343',
  name: 'Cover',
  activityId: 'BFQEA1W2RK1YRETZ9343',
  nodeType: 'activity',
  suppressed: true,
  hidden: true
},
{
  children: [

    {
      id: 'JZLS37EVZQM22H9Q4655',
      name: 'The National Geographic Approach',
      activityId: 'JZLS37EVZQM22H9Q4655',
      nodeType: 'activity',
      suppressed: false,
      hidden: false
    },
  ]
}
]
我的函数如下所示:

const data = [{
  id: 'BFQEA1W2RK1YRETZ9343',
  name: 'Cover',
  activityId: 'BFQEA1W2RK1YRETZ9343',
  nodeType: 'activity',
  suppressed: true,
  hidden: true
},
{
  children: [
    {
      id: 'ZNRAE749BSD0CTGHY888',
      name: 'Consultants, Reviewers, and National Geographic Exploration',
      activityId: 'ZNRAE749BSD0CTGHY888',
      nodeType: 'activity',
      suppressed: false,
      hidden: false
    },
    {
      id: 'JZLS37EVZQM22H9Q4655',
      name: 'The National Geographic Approach',
      activityId: 'JZLS37EVZQM22H9Q4655',
      nodeType: 'activity',
      suppressed: false,
      hidden: false
    },
  ]
}
]
 findNode = (id, arr) => {
    return arr.reduce((a, item) => {
      // if (item.id === id) {
      //   console.log('here');
      //   return item;
      // }
      if (item.id !== id) {
        a.push(item);
      }
      if (item.children) {
        return this.findNode(id, item.children);
      }
    }, []);
  };
函数的reduce累加器未定义,但我不确定原因。它应该制作一个新的数组。我错过了什么


在我看来,这似乎是可行的,但它失败了。也许我的方法完全错了。我应该如何解决这个问题?

在代码中,您没有返回累加器。这就是为什么你没有定义。而且没有理由对未推送的项的子项进行递归,因此应该将递归嵌套在
if

您可以使用
reduce()
在根数组上循环。如果id匹配,只需返回并继续。另一方面,您可以递归地将子对象传递给过滤器并推送到返回数组:

const data=[{id:'BFQEA1W2RK1YRETZ9343',name:'Cover',activityId:'BFQEA1W2RK1YRETZ9343',nodeType:'activity',suprested:true,hidden:true},{children:[{id:'ZNRAE749BSD0CTGHY888',name:'consuggest,Reviewers,and National Geographic Exploration',activityId:'ZNRAE749BSD0CTGHY888',nodept:'activity',nodept:false},{id:'JZLS37EVZQM22H9Q4655',名称:'The National Geographic Approach',activityId:'JZLS37EVZQM22H9Q4655',节点类型:'activity',抑制:false,隐藏:false},]}]
函数过滤器id(id、数据){
返回数据。减少((arr,项目)=>{
如果(item.id!=id){
if(item.children)item.children=filterID(id,item.children)
到货推送(项目)
}

return arr/在您的代码中,您没有返回累加器。这就是您未定义的原因。并且没有理由对您未推送的项的子项进行递归,因此您应该将递归嵌套在
if

您可以使用
reduce()
在根数组上循环。如果id匹配,只需返回并继续。其他方面,您可以递归地将筛选器传递给子数组并推送到返回数组:

const data=[{id:'BFQEA1W2RK1YRETZ9343',name:'Cover',activityId:'BFQEA1W2RK1YRETZ9343',nodeType:'activity',suprested:true,hidden:true},{children:[{id:'ZNRAE749BSD0CTGHY888',name:'consuggest,Reviewers,and National Geographic Exploration',activityId:'ZNRAE749BSD0CTGHY888',nodept:'activity',nodept:false},{id:'JZLS37EVZQM22H9Q4655',名称:'The National Geographic Approach',activityId:'JZLS37EVZQM22H9Q4655',节点类型:'activity',抑制:false,隐藏:false},]}]
函数过滤器id(id、数据){
返回数据。减少((arr,项目)=>{
如果(item.id!=id){
if(item.children)item.children=filterID(id,item.children)
到货推送(项目)
}

return arr//you want remove the node or make new array with the node filtered out make new array with the node filtered out。请参阅@danh,我将看一看。仔细看一下……没有一个具有
id
属性的对象具有子对象。因此,当您说
移除属性时,不清楚您试图筛选什么节点和下面的所有子节点
。是否要删除节点或使用过滤掉的节点创建一个新数组使用过滤掉的节点创建一个新数组。请参阅@danh我会看一看。再仔细看一看……具有
id
属性的对象都没有子对象。因此,不清楚您在删除时尝试过滤什么说
删除节点和下面的所有子节点
。这是我想要的。非常感谢。我差点忘了返回累加器。是的,很容易忘记。非常感谢。我真的很感谢你在周日抽出时间帮我。这是我想要的。非常感谢。我差点忘了返回累加器拉托。是的,很容易忘记。非常感谢你。我真的很感谢你在周日抽出时间来帮助我。