我有以下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")]
如果您需要以任何其他方式执行此操作,请使用以下任何解决方案。
答案 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];
});
答案 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”)。国家
然后它返回:
[对象,对象]