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

时间:2016-06-22 11:39:19

标签: javascript json object

我最初收到

的回复
    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

2 个答案:

答案 0 :(得分:0)

您可以尝试递归。

注意:这不会非常优化,并且可能会为具有高嵌套的大JSON引发错误(超出最大堆栈大小)。

JSFiddle

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

Fiddle