2015-09-11 77 views
1

我想知道一个属性是否存在于json树中,无论深度如何。有没有简单的方法来判断json对象是否包含属性?

isPropertyExists(@JSON @,@属性名@),返回// [@is存在@,@属性值@,@属性路径@]

例如:

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 
+3

这是一个JavaScript对象,而不是一个JSON对象。 – Pointy

+3

递归是你的朋友 – hindmost

+0

使用JSON实际上更容易,你可以查找字符串:'json.indexOf('“lvl1a”:')!= -1'。 – Guffa

回答

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; 
     } 
    }); 
}; 
+0

直截了当! – Muffasa

+0

你的函数不返回一个值,只有你的闭包。 – szdc

1

这是使用简单的递归完成。

使用Object.keys(而不是Object.getOwnPropertyNamesfor..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; 
} 
+0

这段代码看起来很不错 – MrAlex6204

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')); 
相关问题