所以我遇到了一种情况,我在创建报告并希望在javascript中使用这样的结构:
data[2015][2] = {
property: value,
property2: value
};
我不喜欢创建一个数组,因为我觉得这是一个浪费,有一个2015元素数组,我最近几年才会这样做所以我试过.toString()并将它作为属性添加但是这样做不工作(我知道数字不能是像.net这样的语言的属性名称,但不确定javascript是该语言的新手)。我最后只是添加了一年的“y_”和一个月的“m_”并且它工作正常,但我的问题是有没有更好的方法来做到这一点?我是否只是因为2015元素阵列充满未定义而偏执?
答案 0 :(得分:4)
您可以使用对象而不是数组。您可以使用数字作为键,只要它们是字符串即可。因此,为了与您的布局保持一致,您可以执行以下操作:
data = {
"2015": [
"array_elem_0",
"array_elem_1",
{
"property": value,
"property2": value
}
]
}
然后当你需要索引到对象时使用
data["2015"] ...
答案 1 :(得分:4)
您使用的语法对数组或对象完全有效。 Javascript允许使用数字作为属性名称,但它会自动将其转换为字符串(通常不会注意到它)。您需要做的就是将变量初始化为对象而不是数组:
var data = {};
data[2015] = {};
data[2015][2] = ...
要证明data
实际上不是数组,您可以尝试检查它的长度:
console.log(data.length); // undefined
正如我所提到的,这些数字会自动转换为字符串。以下都指向相同的数据:
data[2015][2];
data["2015"]["2"];
data["20" + "15"][1+1];
旁注:
传统上,您甚至可以使用数组而不用担心内存,因为javascript数组传统上是作为稀疏数组实现的。但现代浏览器可能会将某些数组优化为实际数组,因此如果您真的想要节省内存使用对象。
答案 2 :(得分:1)
虽然这里有两个很好的答案,但如果您觉得“偏执”使用带有许多未填充元素的数组,我想专门解答您的问题。
JS数组很棘手,因为它们可能显示为“线性列表”以及“字典”。如果将它们用作“字典”,则实际上使用的是JS Object
属性。所以你在混合内容。
试试这个:
var a = [];
a[10] = "the entry";
console.log("A seems to have a length of: " + a.length);
console.log ("Contents of a:");
for (var key in a) {
console.log("- key " + key + " has: " + a[key]);
}
结果:
"A seems to have a length of: 11"
"Contents of a:"
"- key 10 has: the entry"
实际上只存储了一个元素。这表明length
只是一个信息。它是为了保持数组一致而设置的上边界, if 它被视为整数寻址的元素链。这里,length
与“分配的内存大小”无关。没有“空的存储空间”。
对于一些后续问题,您也可以尝试此更改:
var a = [];
a[5] = "the earlier entry";
a["the_key"] = "disturbing";
a["2015"] = "Top";
a[10] = "the entry";
console.log("A seems to have a length of: " + a.length);
console.log ("Contents of a:");
for (var key in a) {
console.log("- key " + key + " has: " + a[key]);
}
新结果:
"A seems to have a length of: 2016"
"Contents of a:"
"- key 5 has: the earlier entry"
"- key 10 has: the entry"
"- key 2015 has: Top"
"- key the_key has: disturbing"
您始终可以使用Array
上下文以及Object
上下文。
这有后果,例如关于如何循环数组(这已经是一个巨大的讨论,jQuery的.each()
增加了一些问题:-))。
使用经典for
循环,您必须检查元素是否为undefined
。 (首先删除上面的键“2015”)。
for (var i=0; i<a.length; i++) {
console.log("at i=" + i + ": " + a[i]);
}
节目:
"at i=0: undefined"
"at i=1: undefined"
"at i=2: undefined"
"at i=3: undefined"
"at i=4: undefined"
"at i=5: the earlier entry" <<<
"at i=6: undefined"
"at i=7: undefined"
"at i=8: undefined"
"at i=9: undefined"
"at i=10: the entry" <<<
in
的对象循环显示了键。
最后,您似乎已经阐明了Array方法如何为线性数组操作,以及这是否是您所期望的。例如,indexOf()
就像一个线性数组。 indexOf()
的定义为Array
,而不是Object
。因此indexOf()
不会返回字母数字键,只返回线性索引位置。