我最初收到
的回复 var emptyKeys = [];
var FLAG=false;
function emptyObjToNull(object,keysArr){
var isObject, hasKeys, isArray, current;
for(var k in object){
if(!object.hasOwnProperty(k))
return;
current = object[k];
console.log("current KK "+k);
console.log(current);
isObject = typeof current == 'object';
hasKeys = isObject && Object.keys(current).length !== 0;
if(hasKeys){
emptyObjToNull(current, keysArr);
}else if(isObject && !hasKeys){
//object[k] = null; // Set the key directly, not the reference
FLAG=true;
keysArr.push(k);
}
}
}
emptyObjToNull(o,emptyKeys);
console.log(emptyKeys);
我有一个JSON对象,经过一些操作后,对象为空(如空对象102),我想打印它和父对象名称(如“Name2”)。
我试过了,
curl
答案 0 :(得分:0)
您可以尝试递归。
注意:这不会非常优化,并且可能会为具有高嵌套的大JSON引发错误(超出最大堆栈大小)。
var o={StudentInfo:[{Name1:[{100:{a:"12"},1000:{}},{101:{a:"50"}}]},{Name2:[{102:{}},{103:{b:"50"}}]}]};
function findEmptyObjects(obj, parent) {
var result = [];
Object.keys(obj).forEach(function(key) {
var _o = obj[key];
if (Array.isArray(_o)) {
_o.forEach(function(_item) {
if (typeof(_item) === "object")
result = result.concat(findEmptyObjects(_item, key))
})
} else if (typeof(_o) === "object") {
if (isEmptyObject(_o)) {
result.push({
"object": key,
"parent": (parent || "")
})
} else
result = result.concat(findEmptyObjects(_o, key));
}
});
return result;
}
function isEmptyObject(obj) {
return typeof(obj) === "object" && Object.keys(obj).length === 0;
}
var r = findEmptyObjects(o, undefined);
console.log(r)
答案 1 :(得分:0)
如果我理解你的问题,那么应该这样做:
function doitNow(obj, emptyKeys) {
var ittr = [];
if (isObject(obj))
ittr = Object.keys(obj);
ittr.forEach(function(key) {
if (isObject(obj[key]) && Object.keys(obj[key]).length === 0) {
emptyKeys.push(key);
obj[key] = null;
// Array or object will return true. No need for explicit check
} else if (isObject(obj[key]))
obj[key] = doitNow(obj[key], emptyKeys);
});
return obj;
}
function isObject(o) {
return typeof o == 'object';
}
本质上,它将迭代对象属性或查找对象的数组。如果对象没有属性,则将其赋值为null。我认为这是你想要的评论,但如果没有,它可以被删除。然后它将空对象键推送到传递的数组。最后它返回对象。
一旦拥有密钥,您就不必处理与对象不同的数组。数组只是具有数字整数属性的对象(以及与.length
的特殊关系)。我们只检查它是否为递归调用的数组或对象。