многомерный массив JavaScript?

Я надеюсь, что могу ясно выразиться на английском языке и на том, что я хочу создать. Я сначала запускаю с того, что я хочу.

Я хочу сделать IBANcalculator, который может генерировать 1-n IBANnumbers и также проверить данный IBANnumber. IBANnumbers используются во многих странах для оплаты и инструмента, который я хочу сделать, может использоваться для генерации чисел для тестирования цели.

На Википедию (голландский сайт) я нашел список со странами и их способом определить IBANnumber. Что я хочу сделать это для создания своего рода массива, который содержит все страны с их именем, кодом, там IBANlength, bankingformat и формат учетной записи.

Массив должен привыкнуть к:

  1. Генерируйте список выборки (для выбора страны)
  2. используемый для проверки части на генерацию чисел
  3. используемый для проверки части на проверку числа

Я не знаю, является ли массив лучшим способом, но это - до сих пор большая часть знания, которое я имею.

Я уже сделал таблицу как это, которое содержит информацию (эта таблица не используется anyware, но это был хороший способ для меня показать Вам, что я имею в виду о том, как структура):

countryname country code valid IBAN length Bank/Branch Code (check1, bank, branch) Account Number (check2, number, check3)
Andorra AD 24 0 4n 4n 0 12 0
België BE 16 0 3n 0 0 7n 2n
Bosnië-Herzegovina BA 20 0 3n 3n 0 8n 2n

и многое другое.

8
задан Bill the Lizard 22 September 2012 в 12:47
поделиться

3 ответа

Основной ответ

Я бы вообще не использовал для этого «массив». Объекты 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"
    }
};

(Обратите внимание, что я использовал Экранирование 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 собственность на нем, просто чтобы мы все были в здравом уме

Удачного кодирования.

40
ответ дан 5 December 2019 в 04:39
поделиться

Вы можете использовать массив с ассоциативными массивами.

var variable = {
    "countries" : [
                    {"countryname" : "Andorra",
                     "country code" : "AD",
                     "valid IBAN length" : "24",
                     "Bank/Branch Code (check1, bank, branch)": "0  4n 4n",
                     "Acount Number (check2, number, check 3)": "0  12  0"
                    }, 
                    {"countryname" : "België",
                     "country code" : "BE",
                     "valid IBAN length" : "16",
                     "Bank/Branch Code (check1, bank, branch)": "0  3n 0 ",
                     "Acount Number (check2, number, check 3)": "0   7n  2n"    
                    }
                  ]
    };

Вы можете проверить формат JSON http://www.json.org/ .

Например, переменная (страны [0] ["название страны"]); выводит "Андорра".

1
ответ дан 5 December 2019 в 04:39
поделиться

Вы можете использовать javascript как объекты ...

Для простоты вы можете использовать JSON (простой javascript)

var ibans={countries:[
{"name": "Andorra",
"countryCode" : "ad",
mplahmpla:mplah},
{"name": "België",
"countryCode" : "ad",
mplahmpla:mplah},
{"name": "Other",
"countryCode" : "ad",
mplahmpla:mplah}
]
}

, тогда ibans.countries представляет собой массив со всеми странами ... ibans.countries [1]. имя будет Бельги и т. д.

4
ответ дан 5 December 2019 в 04:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: