jQuery / Javascript索引到对象属性的集合/映射?

时间:2011-05-09 20:05:10

标签: javascript jquery json map

我有以下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"}]}];

根据用户选择的国家/地区,我需要从所选的Country对象中刷新选择框的状态选项。我知道我可以用这样的int索引索引到国家集合中......

countryStateMap[0].States

我需要一种通过CountryCode属性获取Country的方法。我知道以下不起作用,但我想做的是这样......

countryStateMap[CountryCode='CA'].States

这可以在没有完全重建我的集合结构的情况下实现,也可以每次迭代集合以找到我想要的那个?

更新: 我接受了mVChr的答案,因为它有效并且是最简单的解决方案,即使它需要第二张地图。

我们实际上最终使用的解决方案是使用国家/地区选择框的索引来索引集合。这是有效的,因为我们的国家下拉列表也来自我们的数据结构。以下是我们索引的方式......

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

如果您需要以任何其他方式执行此操作,请使用以下任何解决方案。

3 个答案:

答案 0 :(得分:6)

您可以做的一件事是缓存地图,这样您只需要进行一次迭代:

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

然后,如果countryCode = 'CA'您可以找到如下状态:

countryStateMap[csmMap[countryCode]].States

答案 1 :(得分: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

答案 2 :(得分:0)

喜欢你的本地jQuery:

小功能:

  

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

然后这样做:

  

getByCountryCode( “CA”)。国家

然后它返回:

  

[对象,对象]