以递归方式删除所有带有空值的JSON密钥,如果删除了所有子密钥,则删除父密钥

use*_*535 1 javascript algorithm recursion json

我试图以递归方式删除JSON对象和所有子对象中的空值.如果子对象键全部被删除,那么我也希望删除该子对象.

即.

x = {
  "applicant": {
    'first_name': null,
    'last_name': null,
    'employment_type': null
  },
  'phone': 1123123,
  'branch': null,
  'industry': {
    'id': 1,
    'name': null
  },
  "status": "333"
}
Run Code Online (Sandbox Code Playgroud)

应该变成这样:

x = {
    'phone': 1123123,
    'industry': {
         "id": 1
     },
     "status": "333"
    }
Run Code Online (Sandbox Code Playgroud)

这是我写的用于删除具有空值的所有键的函数:

function delKeys(app){
  for(key in app){
    if(app[key] !== null && typeof(app[key]) === 'object'){
      delKeys(app[key])
    } 
    if(app[key] === null){
      delete app[key]
      }
  }
Run Code Online (Sandbox Code Playgroud)

但这不会删除没有子项的父键:

所以不是上面的结果,我得到这个:

x = {
    "applicant":{},
    "phone":1123123,
    "industry":{
       'id': 1
     }
     "status": "333"
     }
Run Code Online (Sandbox Code Playgroud)

如您所见,它不会删除申请人密钥.我如何在功能中检查?还是需要在一个单独的函数中编写,我调用它后调用delKeys()?

此外,有没有人看到这个达到最大递归深度?我尝试过更大的JSON对象,它似乎达到了最大递归深度.我非常感谢有关调试的帮助

谢谢.

Yur*_*nko 5

app[key]删除空键后,需要检查是否有键.

const x = {
  "applicant": {
    'first_name': null,
    'last_name': null,
    'employment_type': null
  },
  'phone': 1123123,
  'branch': null,
  'industry': {
    'id': 1,
    'name': null
  },
  "status": "333"
}

function isEmpty(obj) {
  for(var key in obj) return false;

  return true
}

function delKeys(app){
  for(var key in app){
    if(app[key] !== null && typeof(app[key]) === 'object'){
      delKeys(app[key])

      if(isEmpty(app[key])) {
        delete app[key]
      }
    } 
    if(app[key] === null){
      delete app[key]
    }
  }
}

delKeys(x)

console.log(x)
Run Code Online (Sandbox Code Playgroud)