簡體   English   中英

遞歸刪除所有具有空值的JSON密鑰,如果刪除了所有子密鑰,則刪除父密鑰

[英]recursively delete all JSON keys with null values and delete parent key if all child keys are deleted

我試圖遞歸刪除JSON對象和所有Subobjects中的空值。 如果所有子對象鍵都被刪除,那么我也希望該子對象也被刪除。

即。

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

應該變成這樣:

x = {
    'phone': 1123123,
    'industry': {
         "id": 1
     },
     "status": "333"
    }

這是我編寫的用於刪除所有具有空值的鍵的函數:

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]
      }
  }

但這不會刪除沒有子項的父鍵:

所以我得到的不是上面的結果:

x = {
    "applicant":{},
    "phone":1123123,
    "industry":{
       'id': 1
     }
     "status": "333"
     }

如您所見,它不會刪除申請人密鑰。 我將如何在函數中進行檢查? 還是需要在調用delKeys()之后調用的另一個函數中編寫它?

另外,有人看到這個達到最大遞歸深度嗎? 我嘗試使用更大的JSON對象,它似乎達到了最大遞歸深度。 我非常感謝您提供的調試幫助

謝謝。

刪除空鍵后,需要檢查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) 

有一個簡單的解決方案JSON.parsereviver功能。 對每個元素都執行此函數,如果返回undefined ,則從對象中刪除該元素。 您可以檢查value是否為空並在此函數中返回undefined並避免使用任何遞歸函數

 const a = {"applicant":{"first_name":null,"last_name":null,"employment_type":null},"phone":1123123,"branch":null,"industry":{"id":1,"name":null},"status":"333"}; const res = JSON.parse(JSON.stringify(a), (k, v) => { return (v === null // delete null values || (Array.isArray(v) && v.length === 0) // delete empty arrays || (typeof v === 'object' && Object.keys(v).length === 0)) // delete empty objects ? undefined : v // else return the value }); console.log(res) 

delKeys(app[key]);

你應該

delete app[key];

app [key]是一個空對象,不是=== null,因此不會被以下if塊拾取。

使用Object.keys()。length檢查對象是否為空

function delKeys(app){
  for(key in app){
    if(app[key] !== null && typeof(app[key]) === 'object'){
       //extra check for an empty object.
       if(Object.keys(app[key]).length === 0){
         delete app[key]
       }
       else{
          delKeys(app[key])
       }
    } 
    if(app[key] === null){
      delete app[key]
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM