многомерный массив javascript? - PullRequest
8 голосов
/ 27 марта 2010

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

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

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

Массив должен использоваться для:

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

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

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

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

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

Ответы [ 3 ]

40 голосов
/ 27 марта 2010

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

Я бы не использовал "массив" для этого вообще. Объекты 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 на нем, просто чтобы держать нас всех в здравом уме

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

4 голосов
/ 27 марта 2010

Вы можете использовать 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] .name будет Бельгия и т.д ...

1 голос
/ 27 марта 2010

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

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/.

Например, variable(countries[0]["countryname"]); печатает "Андорру".

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