[英]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.parse “ reviver
功能。 對每個元素都執行此函數,如果返回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.