2015-09-11 80 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')); 
相關問題