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

jQuery/Javascript按对象属性索引到集合/映射中?,javascript,jquery,json,map,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",

我用下面的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索引索引到country集合中,就像这样

countryStateMap[0].States
但我需要一种方法来通过CountryCode属性获取国家。我知道下面的方法不起作用,但我想做的是这样的

countryStateMap[CountryCode='CA'].States
在不完全重建集合结构或每次迭代集合以找到所需集合的情况下,可以实现这一点吗

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

我们最终采用的解决方案只是使用国家/地区选择框的索引对集合进行索引。这是因为我们的国家下拉列表也从我们的数据结构中填充。下面是我们如何在

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

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

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

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

热爱您的本地jQuery:

为您提供的小功能:

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

那么就这样做吧:

getByCountryCode(“CA”).州

它返回:

[对象,对象]


为了获得最有效的解决方案,您必须更改结构(从数组到对象)。
countryStateMap[csmMap[countryCode]].States
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 = {};
countryStateMap.get = _.memoize(function(cc) {
    return _.filter(countryStateMap, function(val) {
        val.CountryCode = cc;
    })[0];
});