有没有一种简单的方法来判断json对象是否包含属性?

时间:2015-09-11 13:03:46

标签: javascript json

我想知道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 

3 个答案:

答案 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.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;
}

答案 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'));