js 递归对象中,根据id删除某一项

清水寺小和尚
  • 736
  1. input ID和一个递归对象,删除有ID的该项
  2. 我写的函数如下
      function deleteNode(paramId,obj){
        console.log('enterDelete',obj)
        for(let o in obj){
          if(obj[o].paramId==paramId){
            console.log('从那个里删除',obj)
            obj.splice(o,1)
            return obj
          }
          else{
            if(obj[o].hasOwnProperty('subList')&&obj[o].subList.length!=0){
              console.log(4,JSON.parse(JSON.stringify(obj[o].subList)))
              let m=JSON.parse(JSON.stringify(obj[o].subList))
              deleteNode(paramId,m)
            }
          }
        }

      }

期望

obj={
    "paramId":"默认字典",
    "sourcePath":"默认路径",
    "subList":[
        {
            "paramId":500064,
            "sourcePath":"Result",
            "subList":[
                {
                    "paramId":500061,
                    "sourcePath":"Partners",
                    "subList":[

                    ]
                }
            ]
        }
    ]
}

paramId=500061

//  期望输出

{
    "paramId":"默认字典",
    "sourcePath":"默认路径",
    "subList":[
        {
            "paramId":500064,
            "sourcePath":"Result",
            "subList":[
              //  删除这一项
            ]
        }
    ]
}
回复
阅读 4.7k
2 个回答
donglegend
  • 905

参考一下:

function deleteNode(paramId, obj) {
  if (typeof obj !== 'object' || obj === null) {
    return obj
  }
  const copy = Array.isArray(obj) ? [] : {};
  Object.keys(obj).forEach(key => {
    if (paramId !== obj[key].paramId) {
      copy[key] = deleteNode(paramId, obj[key])
    }
  })
  return copy;
}
function mydelete(id,obj){
  if(obj.paramId===id){
    return true;
  }
  let pure = [];
  for(let i of obj.subList){
    if(mydelete(id,i)){
    }else{
      pure.push(i);
    }
  }
  obj.subList = pure;
  return false;
}

主要问题是递归到下一层以后无法删除自己,所以通知上层的递归删除它就好了,
这里删除的方法,我是直接用的arr替换,如果你有其他的方法也是可以的,注意循环删除时别让数组越界就好了

宣传栏