2012-12-03 49 views
1

我有很多對象,結構不一樣。但我知道他們都有屬性名稱'siteName'。我的問題是如何從這個屬性中獲得價值。 Explame幾個對象:按名稱查找js對象中的屬性

feature1 = { 
    display: "name", 
    feature: { 
     attributes: { 
      when: '111', 
      what: '222' 
     }, 
     geometry: null 
     infoTemplate: undefined 
    }, 
    symbol: null 
    siteName: 'aa' 
} 

feature2 = { 
    feature: { 
     attributes: { 
      when: '111', 
      what: '222' 
     }, 
     geometry: null 
     infoTemplate: undefined 
    }, 
    static: { 
     format: { 
      weight: 12, 
      siteName: 'cccc' 
     }, 
    } 
} 
+0

[動態對象屬性名稱]的可能重複(http://stackoverflow.com/questions/4244896/dynamic-object-property-name) – Esailija

+0

@Esailija:我不認爲這是一個騙局。我認爲重點在於嵌套結構中的屬性位置不可預測。 –

+0

@Esailija它不重複 - 我想按名稱找到對象的屬性 – Krystian

回答

3

下面是應爲你工作遞歸函數。

它返回與名稱一起找到的第一個屬性的值,否則返回undefined

function findByName(obj, prop) { 
    for (var p in obj) { 
     if (p === prop) { 
      return obj[p]; 
     } else if (obj[p] && typeof obj[p] === "object") { 
      var result = findByName(obj[p], prop); 
      if (result !== undefined) 
       return result; 
     } 
    } 
} 

var result = findByName(myObject, "siteName"); 

或者這裏的另一個變化,避免繼承屬性。

function findByName(obj, prop) { 
    if (obj.hasOwnProperty(prop)) 
     return obj[prop]; 

    for (var p in obj) { 
     if (obj[p] && typeof obj[p] === "object") { 
      var result = findByName(obj[p], prop); 
      if (result !== undefined) 
       return result; 
     } 
    } 
} 
+1

哦,Stackoverflow的殘酷世界。毆打你的答案8秒,但速度太慢,無法正確執行遞歸...好了。 – Cerbrus

+0

美麗的功能。我想我以後可能不得不使用這個...... cerbrus ......當我發現他已經發布了這個內容時,我只是在做同樣的事情......吮吸在筆記本電腦的鍵盤上。 – SomeShinyObject

+0

@Cerbrus:是的,我在那裏看到了你的答案......你覺得你很快就會更新它,因爲你很親密。但是FWIW,你不需要'toLowerCase()'。對於本機對象,你總是會從'typeof'中得到一個小寫的''object''。 :) –

1

遞歸遍歷對象:

function find(obj, name) { 
    for (var k in obj) { // Loop through all properties of the object. 
     if(k == name){ // If the property is the one you're looking for. 
      return obj[k]; // Return it. 
     }else if (typeof obj[k] == "object"){ // Else, if the object at [key] is a object, 
      var t = find(obj[k], name); // Loop through it. 
      if(t){ // If the recursive function did return something. 
       return t; // Return it to the higher recursion iteration, or to the first function call. 
      } 
     }    
    } 
} 

用法:

find(feature1, "siteName"); //Returns "aa" 
0

下面的函數應該滿足您的需求:

function getFirstFoundPropertyValue(searchedKey, object) { 
    if(typeof object === "object") { 
     for (var key in object) { 
      var currentValue = object[key]; 
      if(key === searchedKey) { 
       return currentValue; 
      } 
      var nested = getFirstFoundPropertyValue(searchedKey, currentValue); 
      if(typeof nested !== "undefined") { 
       return nested; 
      } 
     } 
    } 
} 

它返回鍵的值,如果鍵被找到,否則undefined。如果該鍵出現好幾次,第一個找到的將被返回。