jQuery/Javascript按对象属性索引到集合/映射中?
我用下面的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",
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];
});