2013-01-23 108 views
1

可能重複:
I have a nested data structure/JSON, how can I access a specific value?搜索JSON對象域== 1

我有一個代表鳥類列表的JSON。每隻鳥都是JSON中的一個對象。每個對象內都有代表位置的字段。這些位置按字母數字編碼,如['P1UBA','P1UBC'等]。這些字段中的值爲1表示存在,而0表示不存在。

下面的代碼顯示了其中一個對象(在整個JSON中有150個)。

[ 
    { 
    "Species": "AMAV", 
    "Common Name": "AMERICAN AVOCET", 
    "Order": "Shorebirds", 
    "Family": "Avocets", 
    "P1UBA": "0", 
    "P1UBC": "1", 
    "P1UBF": "0", 
    "P1UBG": "0", 
    "P1ABA": "0", 
    "P1ABC": "0", 
    "P1ABF": "1", 
    "P1ABFb": "0", 
    "P1ABG": "0", 
    "P1USA": "0", 
    "P1USC": "0", 
    } 
] 

我該如何搜索這個對象並返回位置字段== 1?理想情況下我會創建一個新的數組是這些領域== 1

使用對象的字符串以上,這將導致

var birdsMatch=['P1UBC','P1ABF'] 

一個新的字符串,我想使用jquery,但我開放如果效率更高,則爲純JavaScript解決方案

回答

1

使用jQuery.map

var birds = $.map(birdObj, function(value, key) { 
    return value === '1' ? key : null; 
}); 

//birds => ["P1UBC", "P1ABF"] 
+0

這工作得很好... – snowgage

+0

謝謝!我喜歡的是少量的代碼:) – nekman

1

鑑於每個鳥類物體都位於名爲Birds的數組中,下面的工作將會發揮作用。

$(data.Birds).each(function(index, element){ 
    if(element.value == '1') 
     alert("FOUND BIRDS IN " + element.name); 
}) 
1
var attr, result_arr = []; 

for (attr in birdObj){ 
    if (birdObj[attr] === "1"){ 
     result_arr.push(attr); 
    } 
} 

哪裏birdObj類似於你在上面給obj的例子。

1

您可以通過所有的鳥都有循環,那麼雖然每隻鳥的所有屬性,收集的位置(假設VAR birds包含您解析的JSON):

var birdsMatch = {}; 
for(var i=0; i<birds.length; i++) { 
    // Create an empty array to keep locations found for each species 
    birdsMatch[birds[i].Species] = []; 
    for(var loc in birds[i]) { 
     if(birds[i][loc] === 1) { 
      // Found! Add location to the correct species array 
      birdsMatch[birds[i].Species].push(loc); 
     } 
    } 
} 

在年底,birdsMatch物體看起來像這樣的:

{ 
    AMAV : ['P1UBC','P1ABF'], 
    OTHER_SPECIES : [], // not found in any locations 
    YET_ANOTHER : ['LOC1'] 
    // ... 
} 
+0

雖然我給你一個完整的答案,但我強烈建議閱讀Felix Kling建議的副本,以更好地理解遍歷js對象的工作原理。你的問題可能會被視爲一種欺騙手段 - 但是這次我沒有投票結束,因爲我認爲這對你的問題太過於通用。 – bfavaretto