jQuery/Javascript 索引成 collection/map by object 属性

jQuery/Javascript index into collection/map by object property?

本文关键字:by object 属性 map Javascript 索引 jQuery collection      更新时间:2023-09-26

我有以下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

不过,我需要一种方法来获取按国家/地区代码属性。我知道以下内容不起作用,但我想做的是这样的事情......

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;
}

然后,如果countryCode = '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 = {};

现在你可以这样称呼.get("CA")

countryStateMap.get("CA").States

如果你更喜欢合成糖,你可能会对下划线感兴趣,它有实用的方法,使这种代码更容易编写

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

_.memoize_.filter

喜欢你的本地jQuery:

适合您的小功能:

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

所以这样做吧:

getByCountryCode("CA").国家

它返回:

[对象,对象]