数字作为javascript对象的属性

时间:2015-03-12 03:49:38

标签: javascript

所以我遇到了一种情况,我在创建报告并希望在javascript中使用这样的结构:

data[2015][2] = {
   property: value,
   property2: value
};

我不喜欢创建一个数组,因为我觉得这是一个浪费,有一个2015元素数组,我最近几年才会这样做所以我试过.toString()并将它作为属性添加但是这样做不工作(我知道数字不能是像.net这样的语言的属性名称,但不确定javascript是该语言的新手)。我最后只是添加了一年的“y_”和一个月的“m_”并且它工作正常,但我的问题是有没有更好的方法来做到这一点?我是否只是因为2015元素阵列充满未定义而偏执?

3 个答案:

答案 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()不会返回字母数字键,只返回线性索引位置。

http://www.javascripture.com/Array

http://www.ecma-international.org/ecma-262/5.1/#sec-15.4