我有一个类似下面的对象
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,任何帮助表示赞赏。
答案 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