如何在JavaScript中删除嵌套对象树中的特定节点

时间:2017-03-28 07:35:17

标签: javascript recursion iteration

这是我的算法技能结束的地方。我可以遍历对象并找到某个对象,但我无法在同一时间删除该对象。

这是对象

const obj = {
    children: [{
        children: [
            {
                children: [
                    {
                        key: 'a1',
                        type: 'a1_type'
                    },
                    {
                        key: 'a2',
                        type: 'a2_type'
                    }
                ],
                key: 'root',
                type: 'root_type'
            },
            {
                key: 'error',
                type: 'error_type'
            }
        ]
    }]
}

具有键==='error'对象的对象可以在任何子数组中。我想找到它并删除包含密钥的对象。

输出应该是这样的:

let output = findAndDeleteObjByKeyAndType('error', 'error_type')

output = {
    children: [{
        children: [
            {
                children: [
                    {
                        key: 'a1',
                        type: 'a1_type'
                    },
                    {
                        key: 'a2',
                        type: 'a2_type'
                    }
                ],
                key: 'root',
                type: 'root_type'
            }
        ]
    }]
} 

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

filterevery之类的数组方法可以派上用场:

const object = {
  children: [{
    children: [{
        children: [{
            key: 'a1',
            type: 'a1_type'
          },
          {
            key: 'a2',
            type: 'a2_type'
          },
          {
            key: 'error',
            type: 'error_type'
          }
        ],
        key: 'root',
        type: 'root_type'
      },
      {
        key: 'error',
        type: 'error_type'
      }
    ]
  }]
}

function purgeAll (object, target) {
  if (object.children) {
    const keys = Object.keys(target)
    object.children = object.children.filter(o => 
      !keys.every(k => target[k] === o[k]) && purgeAll(o, target)
    )
  }
  return object
}

let output = purgeAll(object, {
  key: 'error',
  type: 'error_type'
})

console.log(output)
.as-console-wrapper { min-height: 100%; }