主要答案
我不会使用"数组"来完成这个任务。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"
}
};
(请注意,我已经使用带上缀符号的'e'的Unicode转义;这样做可能最好,但是如果您的编码正确,应该也没问题。)
代码使用对象字面量表示法创建单个对象和整个映射表。在整个映射表中,每个国家都有一个属性,属性键是国家代码,属性值是提供自己表格信息的对象。
然后,您可以像这样使用国家代码在映射表中查找国家的信息:
var countryInfo = IBANInfo["AD"]
如果您有另一个变量中的国家代码:
var countryCode = "AD";
var countryInfo = IBANInfo[countryCode];
alert("Country name: " + countryInfo.countryName);
显然,如果你喜欢使用其他内容来查找,只需相应地进行调整。
在键上加前缀出于偏执
当我处理那些我几乎没有控制权的信息时,我通常会在键上添加前缀,以避免与对象的内置属性发生冲突(尽管我认为这里不太可能发生冲突)。例如,如果你使用了“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"
遍历map中的键
如果你需要(出于任何原因)遍历所有键,由于它不是一个数组,你不能使用数字索引。幸运的是,这正是JavaScript中的for..in
循环的用途:它遍历对象属性的名称(键):
var key;
for (key in IBANInfo) {
if (IBANInfo.hasOwnProperty(key)) {
}
}
使用
hasOwnProperty
可以区分对象直接设置的属性和从其原型继承的属性。如果您不熟悉JavaScript的原型继承,请不要太担心,只需像上面的循环一样使用即可。
由于JavaScript数组是对象,而所有JavaScript对象都是映射,因此您甚至可以将数字索引和按国家/地区代码索引相结合。以下是一个示例:
地图:
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"
}
];
var index, entry;
for (index = 0; index < IBANInfo.length; ++index)
{
entry = IBANInfo[index];
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"
在事后进行交叉索引(如上所述)最适用于类似IBAN映射这样的静态内容。如果您将作为程序的一部分添加或删除条目,我可能会将其制作成可重复使用的对象。
如果我需要按数字和关键字查找,我通常会通过使映射方面成为数组属性而将事物稍微分离出来,而不是直接使用数组。这仅需要对创建映射的循环进行小更改,即在初始化数组后创建映射:
地图:
var IBANInfo = [
];
var index, entry;
IBANInfo.byCC = {};
for (index = 0; index < IBANInfo.length; ++index)
{
entry = IBANInfo[index];
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
属性的数组,只是为了让我们都保持清醒
愉快的编码。