Основной ответ
Я бы не использовал "массив" для этого вообще. Объекты JavaScript - это карты (иногда называемые «ассоциативными массивами», но давайте используем «карту», чтобы избежать путаницы с числовыми индексированными массивами), поэтому вы можете легко сделать это с простыми объектами:
var IBANInfo = {
"AD": {
countryCode: "AD",
countryName: "Andorra",
length: 24,
bankBranchCode: "0 4n 4n",
accountNum: "0 12 0"
},
"BE": {
countryCode: "BE",
countryName: "Belgi\u00EB",
length: 16,
bankBranchCode: "0 3n 0",
accountNum: "0 7n 2n"
},
"BA": {
countryCode: "BA",
countryName: "Bosni\u00EB-Herzegovina",
length: 20,
bankBranchCode: "0 3n 3n",
accountNum: "0 8n 2n"
}
};
(Обратите внимание, что я использовал escape-код Unicode для 'e' с умлаутом над ним; вероятно, к лучшему, хотя, если вы будете осторожны с вашими кодировками, у вас все будет в порядке.)
Использует литеральную запись объекта для создания отдельных объектов и общей карты. На общей карте есть свойство для каждой страны, ключом которого является код страны, а значением свойства является объект, предоставляющий информацию из вашей таблицы.
Затем вы можете найти информацию о стране на карте, используя ее код страны, например:
var countryInfo = IBANInfo["AD"]; // <= Example for Andorra
Или, если у вас есть код страны в другой переменной:
var countryCode = "AD"; // <= Example for Andorra
var countryInfo = IBANInfo[countryCode];
alert("Country name: " + countryInfo.countryName); // <= Alerts "Country name: Andorra"
Очевидно, что если вы предпочитаете искать что-то, кроме кода страны, просто отрегулируйте все соответствующим образом.
Установка префикса на клавиши из паранойи
Когда я делаю это с информацией, над которой у меня мало контроля, я обычно ставлю префикс на ключ, чтобы избежать проблем с конфликтами со встроенными свойствами объекта (хотя я не думаю, что существует большая вероятность конфликта Вот). Например, если вы используете префикс "cc", все будет выглядеть так:
Карта:
var IBANInfo = {
"ccAD": {
countryCode: "AD",
countryName: "Andorra",
length: 24,
bankBranchCode: "0 4n 4n",
accountNum: "0 12 0"
},
"ccBE": {
countryCode: "BE",
countryName: "Belgi\u00EB",
length: 16,
bankBranchCode: "0 3n 0",
accountNum: "0 7n 2n"
},
"ccBA": {
countryCode: "BA",
countryName: "Bosni\u00EB-Herzegovina",
length: 20,
bankBranchCode: "0 3n 3n",
accountNum: "0 8n 2n"
}
};
Поиск:
var countryCode = "AD"; // <= Example for Andorra
var countryInfo = IBANInfo["cc" + countryCode]; // <= Note we add the prefix on lookup
alert("Country name: " + countryInfo.countryName); // <= Alerts "Country name: Andorra"
Цикл по клавишам на карте
Если вам нужно (по любой причине) пройти через все эти циклы, так как это не массив, вы не можете использовать числовой индекс. К счастью, именно для этого и предназначен цикл JavaScript for..in
: он просматривает имена (ключи) свойств объекта:
var key;
for (key in IBANInfo) {
if (IBANInfo.hasOwnProperty(key)) {
// ...use key here, it'll be "ccAD" for Andorra, etc...
}
}
(Вы используете hasOwnProperty
, чтобы различать свойства, которые объект установил для него напрямую , и свойства, полученные из его прототипа. Если вы не знакомы с прототипным наследованием JavaScript, не беспокойтесь слишком много, просто обязательно используйте цикл, как описано выше.)
Лучшее из обоих миров
Поскольку массивы JavaScript являются объектами, а все объекты JavaScript являются картами, вы можете даже комбинировать числовую индексацию и индексацию по коду страны. Вот пример этого:
Карта:
// First, build the array
var IBANInfo = [
{
countryCode: "AD",
countryName: "Andorra",
length: 24,
bankBranchCode: "0 4n 4n",
accountNum: "0 12 0"
},
{
countryCode: "BE",
countryName: "Belgi\u00EB",
length: 16,
bankBranchCode: "0 3n 0",
accountNum: "0 7n 2n"
},
{
countryCode: "BA",
countryName: "Bosni\u00EB-Herzegovina",
length: 20,
bankBranchCode: "0 3n 3n",
accountNum: "0 8n 2n"
}
];
// Now, cross-index it
var index, entry;
for (index = 0; index < IBANInfo.length; ++index)
{
// Get the entry at this numeric index
entry = IBANInfo[index];
// Create the country code lookup for it
IBANInfo["cc" + entry.countryCode] = entry;
}
Именно здесь эти префиксы становятся очень важными, поскольку массивы имеют больше свойств, чем простые объекты.
Поиск по коду страны не изменился:
var countryCode = "AD";
var countryInfo = IBANInfo["cc" + countryCode]; // <= Country code lookup
alert("Country name: " + countryInfo.countryName); // <= Alerts "Country name: Andorra"
Но теперь, если (по какой-то причине) вам нужно использовать числовой индекс, вы также можете сделать это:
var countryInfo = IBANInfo[0]; // <= Numeric lookup
alert("Country name: " + countryInfo.countryName); // <= Also alerts "Country name: Andorra"
Перекрестная индексация после того, как aboev лучше всего подходит для статических вещей, таких как ваша карта IBAN. Если бы вы собирались добавлять или удалять записи из этого как часть вашей программы, я бы, вероятно, вместо этого сделал из них объект многократного использования.
Если мне нужны вещи как численно, так и по ключу, я обычно немного разделяю вещи, делая аспекты карты свойством массива, а не использую массив напрямую. Это требует лишь небольшого изменения нашего цикла, который создает карту после того, как мы инициализировали массив:
Карта:
// First, build the array
var IBANInfo = [
/* ...same as before, omitted for space... */
];
// Now, cross-index it
var index, entry;
IBANInfo.byCC = {}; // A new plain object to be our map
for (index = 0; index < IBANInfo.length; ++index)
{
// Get the entry at this numeric index
entry = IBANInfo[index];
// Create the country code lookup for it
IBANInfo.byCC["cc" + entry.countryCode] = entry;
}
Поиск кода страны, затем используйте свойство byCC
:
var countryCode = "AD";
var countryInfo = IBANInfo.byCC["cc" + countryCode]; // <= Country code lookup
// The change is here:-^^^^^
alert("Country name: " + countryInfo.countryName); // <= Alerts "Country name: Andorra"
Итак, вы, куча вариантов:
- Массив (ищите по числовому индексу, а не по коду страны; это покрыто другими ответами или просто не включайте цикл перекрестной индексации выше)
- Карта (поиск по коду страны, а не по числовому индексу)
- Массив с дополнительными свойствами (поиск по числовому индексу или код страны)
- Массив с отдельным свойством
byCC
на нем, просто чтобы держать нас всех в здравом уме
Удачного кодирования.