嵌套对象迭代并返回空值键名nodejs

时间:2018-08-13 09:40:56

标签: javascript json node.js lodash

我有一个类似下面的对象

     var json = {
      "info": {
      "name": {},
      "addr": {
        "strreet": "NYC",
        "zip": 123456789
       }
     }
   }

我想在有空对象的地方返回键,例如,它可能嵌套在上面的json中,“ name”为空,所以我想编写一个函数并在此处返回“ name”

我已经为下面给出的函数编写了函数

function iterate(obj) {
for (var property in obj) {
    if (obj.hasOwnProperty(property)) {
        if (typeof obj[property] == "object") {
            if (JSON.stringify(obj[property]) === '{}') {
                return property
            } else
                iterate(obj[property]);
        } else {}
    }
}
}

现在我像这样调用该函数

var key = iterate(json)
console.log('Key',key)

现在键正在打印undefined,任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

函数iterate需要一些东西。您必须从else

返回
return iterate(obj[property]);

var json = {
      "info": {
      "name": {},
      "addr": {
        "strreet": "NYC",
        "zip": 123456789
       }
     }
   }


function iterate(obj) {
for (var property in obj) {
    if (obj.hasOwnProperty(property)) {
        if (typeof obj[property] == "object") {
            if (JSON.stringify(obj[property]) === '{}') {
                return property
            } else
                return iterate(obj[property]);
        } else {}
    }
}
}


var key = iterate(json)
console.log('Key', key)

答案 1 :(得分:1)

您可以保留一个空白数组,并继续在其中推送空属性。最后,您需要返回此数组以使递归起作用,并且在递归调用函数的位置,需要将其内容推送到空属性数组中。

var json = {
  "personInfo": {
    "personAttributesInfo": {
      "location": {
        "city": "New york",
        "state": {},
      }
    }
  },
  "dataInfo": {
    "travelPricing": {},
    "cost": {
      "usd": 12345,
      "someother": {},
    }
  }
};

function iterate(obj) {
  var emptyProperties = [];
  for (var property in obj) {
    if (obj.hasOwnProperty(property)) {
      if (typeof obj[property] == "object") {
        if (Object.keys(obj[property]).length === 0) {
          emptyProperties.push(property);
        } else{
          let x = iterate(obj[property]);
          emptyProperties.push(...x);
        }
      } else {
        continue;
      }
    }
  }
  return emptyProperties;
}

var key = iterate(json)
console.log('Key', key);

答案 2 :(得分:0)

此答案使用object-scan

正如作者在评论中指出的那样,仅返回第一次相遇。

观察:

  • object-scan将遍历嵌套数组。如果不希望这样,可以在!Array.isArray(value)中检查breakFn
  • 如果性能很重要,可以将object-scan的编译和搜索部分分开
const objectScan = require('object-scan');

const isEmptyObject = (value) => (
  value instanceof Object
  && !Array.isArray(value)
  && Object.keys(value).length === 0
);
const finder = (input) => objectScan(['**'], {
  abort: true,
  rtn: 'key',
  filterFn: ({ value }) => isEmptyObject(value)
})(input).pop();

const json = {"personInfo":{"personAttributesInfo":{"location":{"city":"New york","state":{}}}},"dataInfo":{"travelPricing":{},"cost":{"usd":12345,"someother":{}}}};

console.log(finder(json));
// => someother