我正在尝试以递归方式删除JSON对象和所有子对象中的空值。如果子对象键全部被删除,那么我也希望删除该子对象。
即
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对象,它似乎达到了最大递归深度。我非常感谢帮助调试
谢谢你。答案 0 :(得分: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)

答案 1 :(得分:2)
有JSON.parse'reviver
功能的简单解决方案。对每个元素执行此函数,如果它返回undefined
,则从对象中删除该元素。您可以检查值是否为空并在此函数中返回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)
答案 2 :(得分:1)
在
delKeys(app[key]);
你应该
delete app[key];
app [key]是一个空对象,而不是=== null,因此以下if块不会被它取回。
答案 3 :(得分:1)
使用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]
}
}