2011-05-09 39 views
3

我有以下的Javascript界定国家及其状态的阵...通过对象属性将jQuery/Javascript索引导入到集合/映射中?

var countryStateMap = [{"CountryCode":"CA","Name":"Canada","States":[{"StateCode":"S!","CountryCode":"CA","Name":"State 1"},{"StateCode":"S2","CountryCode":"CA","Name":"State 2"}]},"CountryCode":"US","Name":"United States","States":[{"StateCode":"S1","CountryCode":"US","Name":"State 1"}]}]; 

基于用户选择,我需要刷新选择框的选项从选定的国家目标国家哪一个国家。我知道我可以索引到一个像这样的int索引的国家收藏...

countryStateMap[0].States 

我需要一种方法来获得国家by CountryCode属性,虽然。我知道下面不工作,但我想要做的就是这样的事情...

countryStateMap[CountryCode='CA'].States 

可以这样不必每次都完全重建我的收藏品的结构或遍历集合,以找到一个可以实现我想要?

更新: 我接受mVChr的答案,因为它的工作,是最简单的解决方案,即使它所需的第二图。

我们实际上最终选择的解决方案是使用国家/地区选择框的索引来索引该集合。这是有效的,因为我们的国家下拉菜单也正在从我们的数据结构中填充。下面是我们如何在索引...

countryStateMap[$('#country').attr("selectedIndex")] 

如果您需要做任何其他的方式,使用任何以下解决方案。

+0

对于你必须改变你的结构(从数组对象)的最有效的解决方案。 – 2011-05-09 20:09:15

回答

6

有一两件事你可以做的是缓存中的地图,这样你只需要做迭代一次:

var csmMap = {}; 
for (var i = 0, cl = countryStateMap.length; i < cl; i++) { 
    csmMap[countryStateMap[i].CountryCode] = i; 
} 

这时如果countryCode = 'CA'你可以找到它的状态,如:

countryStateMap[csmMap[countryCode]].States 
2
countryStateMap.get = function(cc) { 
    if (countryStateMap.get._cache[cc] === void 0) { 
     for (var i = 0, ii = countryStateMap.length; i < ii; i++) { 
      if (countryStateMap[i].CountryCode === cc) { 
       countryStateMap.get._cache[cc] = countryStateMap[i]; 
       break; 
      } 
     } 
    } 
    return countryStateMap.get._cache[cc]; 
} 
countryStateMap.get._cache = {}; 

现在你可以直接拨打.get("CA")

countryStateMap.get("CA").States

如果你喜欢语法糖,你可能有兴趣在underscore具有实用的方法,使这种代码更易于编写

countryStateMap.get = _.memoize(function(cc) { 
    return _.filter(countryStateMap, function(val) { 
     val.CountryCode = cc; 
    })[0]; 
}); 

_.memoize_.filter

0

爱你当地的jQuery:

小小功能适合你:

getByCountryCode = function(code){var res = {}; $。each(countryStateMap,function(i,o){if(o.CountryCode == code)res = o; return false;}); return res}

这样做,那么:

getByCountryCode( “CA”)。美国

,并返回:

[对象,对象]

相关问题