Javascript 如何在包含空对象的嵌套对象中递归查找键名?

Javascript 如何在包含空对象的嵌套对象中递归查找键名?,javascript,json,object,Javascript,Json,Object,我最初收到的答复是: var o={ "StudentInfo": [{ "Name1": [{ "100": { "a": "12" } }, { "101": { "a": "50" } }] }, { "Name2": [{ "1

我最初收到的答复是:

var o={
    "StudentInfo": [{
        "Name1": [{
            "100": {
                "a": "12"
            }
        }, {
            "101": {
                "a": "50"
            }
        }]
    }, {
        "Name2": [{
            "102": {}
        }, {
            "103": {
                "b": "50"
            }
        }]
    }]
}
我有一个JSON对象,经过一些操作,对象是空的(比如空对象102),我想打印它和父对象的名称(比如“Name2”)

我试过这个

    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抛出错误(超过最大堆栈大小)

var o={StudentInfo:[{Name1:[{100:{a:12},1000:{},{101:{a:50}]},{Name2:[{102:{},{103:{b:50}]};
函数findEmptyObject(对象,父对象){
var结果=[];
Object.keys(obj).forEach(函数(key){
var_o=obj[key];
if(Array.isArray(_o)){
_o、 forEach(功能(_项){
if(类型(_项)=“对象”)
result=result.concat(findEmptyObjects(_项,键))
})
}else if(typeof(_o)=“object”){
if(isEmptyObject(_o)){
结果:推({
“对象”:键,
“父项”:(父项| |“”)
})
}否则
result=result.concat(findEmptyObjects(_o,key));
}
});
返回结果;
}
函数isEmptyObject(obj){
返回typeof(obj)==“object”&&object.keys(obj).length==0;
}
var r=FindEmptyObject(o,未定义);

console.log(r)
如果我正确理解您的问题,应该这样做:

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
的特殊关系)。我们只检查它是否是递归调用的数组或对象


结构是否可以嵌套得更多?您只想找到空对象,对吗?如果您的初始对象具有固定结构-无需使用递归,只需循环不,它不是固定结构。是的,我想查找空对象及其父项。例如,如果102是空的,我想打印“Name2”,如果101和102是空的,那么我想打印“Name1”和“Name2”。。。respectively@user3265033:上述评论中的要求与问题标题不一致。102不是空数组,它是空对象。您应该首先检查数组
typeof a
还将返回
object
@Rajesh实际上,这样做更简单,不需要进行检查<代码>对象。数组上的键将返回数值属性。有趣的是,我以前从未这样做过。我不知道我对你该不该怎么想。编辑:查看下表,它似乎完全可以接受。然后您应该删除对
Array.isArray
的检查。在循环之前,还要检查
ittr
是否为数组类型。如果ittr类似于
“a”:“50”
,则会失败,因为它没有forEachfunction@Rajesh修改了它,找到了更好的方法。