我想知道json树中是否存在属性,无论其深度如何。
isPropertyExists(@JSON @,@ property name @)//返回[@is exists @,@ property value @,@ property path @]
示例:
var jsonObj={
lvl1a:{
lvl2a:{lvl3:"some value"},
lvl2b:{lvl3a:"some value",
lvl3b:"some value"}
},
lvl1b:{
lvl2aa:"some value",
lvl2bb:{target1:"some value"}
}
}
isPropertyExists(jsonObj,'lvl1a') // returns [true,jsonObj.lvl1a,'jsonObj.lvl1a']
isPropertyExists(jsonObj,'target1') // returns [true,jsonObj.lvl1b.lvl2bb.target1,'jsonObj.lvl1b.lvl2bb.target1']
isPropertyExists(jsonObj,'target2') // returns false
答案 0 :(得分:2)
没有路径的解决方案:
function hasProp(obj, prop) {
Object.keys(obj).forEach(function (key) {
if (key === prop) {
return [true, obj[key]];
} else if (typeof obj[key] === 'object') {
hasProp(obj[key], prop);
} else {
return false;
}
});
};
答案 1 :(得分:1)
这是使用简单的递归完成的。
使用Object.keys(而非Object.getOwnPropertyNames或for..in loop,因为后两者将迭代原型链中的属性。)
解决方案
迭代对象的可枚举属性。如果任何属性名称与我们要搜索的名称匹配,则返回true。否则,如果属性的值是另一个对象,也要迭代该对象。
示例方法
function propertyExists(name, o) {
var properties = Object.keys(o);
for (var i = 0; i < properties.length; i++) {
var property = properties[i];
if (property === name)
return true;
if (typeof o[property] === 'object' && propertyExists(o[property], name))
return true;
}
return false;
}
答案 2 :(得分:0)
哟需要实现递归函数,这将调用自身
function isPropertyExists (Json,findPropertyName,rootName) {
var found = false;
rootName+='->';
for(iPropertyName in Json){
var iPropertyObject = Json[iPropertyName];
rootName+=iPropertyName;
console.log(rootName);
if(iPropertyName == findPropertyName){
console.log('-Exist!');
found = true;
break;
} else{
//===>If is an object is because could contains a nested Json
if(typeof iPropertyObject =='object' ){
//===>Call itself and if return true will exit from the for loop an return true
if(isPropertyExists(iPropertyObject,findPropertyName,rootName)){
found = true;
break;
}
}
}
rootName+='->';
}
return found;
}
console.log('End Result:',isPropertyExists(jsonObj,'target1','Root'));