2010-02-03 97 views
3

我已经得到了包括在我的javascript JSON文件定义变量看起来像这样的数组:整蛊的Javascript:如何从JSON字典里面的值里面字典:)

var places_json = { 
"count": 13476, 
"places": [ 
     {"area": "London", "county": "STS", "lat": 52.300151820000004, "lon": -2.36665606, "code": "7567", "id": 1}, 
     {"area": "Sheffield", "county": "STS", "lat": 51.33648680000003, "lon": 0.98861179000000001, "code": "9919", "id": 6}, 
     {"area": "Huxton", "county": "STS", "lat": 53.27483902, "lon": -1.0146250700000001, "code": "9953", "id": 11}, 
]} 

而且我想使用Javascript为id为11的条目检索area的值。

有谁知道如何做到这一点?对我来说太难了 - 我的Javascript并不那么先进。如果我知道,我需要的条目的数组索引,那么我可以这样做:

var entry = json_places.places[i] 

,但我不知道它,不幸的是,ID的只是价值(这是唯一的)。

在此先感谢。

+0

你使用任何JS库? – adamJLev 2010-02-03 22:29:44

+0

不 - 只是javascript(虽然我可以添加一个,如果它不可能做任何其他方式) – AP257 2010-02-03 22:31:01

+0

这绝对是可能的,你可以在下面的答案中看到。我只是问,以便我可以提供使用库而不是通用JS的答案 – adamJLev 2010-02-03 22:36:31

回答

1

只需循环浏览您的位置即可找到适当的项目。

var area = null; 
for(var i = 0; i < json_places.places.length; i++) { 
    if(json_places.places[i].id == 11) { 
    area = json_places.places[i].area; 
    break; 
    } 
} 

alert(area); 

如果你想有一个函数来为你做它,你可以运行以下命令:

json_places.get_place = function(id) { 
    return (function(id) { 
      for(var i = 0; i < this.places.length; i++) { 
       if(this.places[i].id == id) { 
       return this.places[i]; 
       } 
      } 

      return null; 
      }).apply(json_places, id); 
} 

然后,您只需做到以下几点:

alert(json_places.get_place(11).area); 
+1

使用'for in'作为哈希,而不是数组。这是一个坏习惯。 :) – 2010-02-03 22:40:44

+1

@Anthony Mills:使用'for in'作为数组没有任何问题。 'ECMA-262'的'12.6.4'节陈述任何'[[Enumerable]]'属性为true的对象都可以用于这样的循环。数组有资格。 – 2010-02-03 22:44:59

+0

欢迎所有人回答。选择这一个,因为它第一次完美工作,并为内联代码和功能的组合。谢谢! – AP257 2010-02-03 22:46:13

0
function get_area(places_json, id) { 
    for (var i = 0; i < places_json.places.length; i++) { 
     if (places_json.places[i].id === id) { 
      return places_json.places[i].area; 
     } 
    } 
} 

而且,如果你知道你有JavaScript 1.5可用(或者你不介意粘贴https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter的代码......),特别是如果你知道LINQ:

function get_area(places_json, id) { 
    return places_json.places.filter(function (place) { place.id === id; })[0].area; 
} 
3
function findAreaById(placesArray, id) {  
    var place = null; 
    for (var i = 0, length = placesArray.length; i < length; i++) { 
     place = placesArray[i]; 
     if (place.id === id) { 
      return place.area; 
     } 
    } 
    return null; 
} 
0

使用jQuery(尽管这个问题已经被充分回答):

var area = null; 
$.each(places_json.places, function() { 
    if(this.id == 11) { 
     alert("Area is " + this.area); 
     area = this.area; 
     return false; 
    } 
}); 

参见:

http://api.jquery.com/jQuery.each/