jQuery / Javascript индекс в коллекцию / карту по свойству объекта? - PullRequest
3 голосов
/ 10 мая 2011

У меня есть следующий 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

Мне нужен способ получить свойство Country by CountryCode.Я знаю, что следующее не работает, но я хотел бы сделать что-то вроде этого ...

countryStateMap[CountryCode='CA'].States

Может ли это быть достигнуто без полной перестройки структуры моей коллекции или перебора набора каждый раз, чтобы найтитот, который я хочу?

ОБНОВЛЕНИЕ: Я принял ответ mVChr, потому что он работал и был самым простым решением, хотя для него требовалась вторая карта.Индекс коробки выбора страны для индексации в коллекции.Это сработало, потому что выпадающий список нашей страны также заполнялся из нашей структуры данных.Вот как мы проиндексировали ...

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

Если вам нужно сделать это любым другим способом, воспользуйтесь одним из приведенных ниже решений.

Ответы [ 3 ]

6 голосов
/ 10 мая 2011

Одна вещь, которую вы можете сделать, это кэшировать карту, поэтому вам нужно будет выполнить итерацию только один раз:

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

Тогда, если countryCode = 'CA', вы можете найти его состояния как:

countryStateMap[csmMap[countryCode]].States
2 голосов
/ 10 мая 2011
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

0 голосов
/ 10 мая 2011

люблю ваш локальный jQuery:

маленькая маленькая функция для вас:

getByCountryCode = function (code) {var res = {}; $. Each (countryStateMap, function (i, o) {if (o.CountryCode == code) res = o; вернуть false;}); вернуть res}

, поэтому сделайте это тогда:

getByCountryCode ("CA"). Состояния

и возвращает:

[Object, Object]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...