2013-01-23 109 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