数字作为javascript对象的属性

数字作为javascript对象的属性,javascript,Javascript,因此,我在创建报告时遇到了一种情况,希望在javascript中使用这样的结构: data[2015][2] = { property: value, property2: value }; 我不喜欢创建一个数组,因为我觉得用一个2015元素的数组来做我最近几年才有的东西是一种浪费,所以我尝试了.toString()并将其添加为属性,但这不起作用(我知道在.net等语言中数字不能作为属性名称,但不确定javascript是否是该语言的新成员). 最后,我只为年份加了一个“y”,为月

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

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

我不喜欢创建一个数组,因为我觉得用一个2015元素的数组来做我最近几年才有的东西是一种浪费,所以我尝试了.toString()并将其添加为属性,但这不起作用(我知道在.net等语言中数字不能作为属性名称,但不确定javascript是否是该语言的新成员). 最后,我只为年份加了一个“y”,为月份加了一个“m”,效果很好,但我的问题是,有没有更好的方法?我是不是对一个2015元素数组充满了未定义的元素心存疑虑?

你可以使用对象而不是数组。您可以使用数字作为键,只要它们是字符串。因此,根据您的布局,您可以执行以下操作:

data = {
    "2015": [
        "array_elem_0",
        "array_elem_1",
        {
            "property": value,
            "property2": value
        }
    ]
}
然后,当您需要索引到对象时,请使用

data["2015"] ...

您使用的语法对数组或对象都完全有效。Javascript允许使用数字作为属性名,但它会自动将其转换为字符串(您通常不会注意到)。您只需将变量初始化为对象而不是数组:

var data = {};
data[2015] = {};
data[2015][2] = ...
要证明
数据
实际上不是数组,可以尝试检查其长度:

console.log(data.length); // undefined
正如我提到的,数字会自动转换为字符串。以下所有数据都指向相同的数据:

data[2015][2];
data["2015"]["2"];
data["20" + "15"][1+1];

旁注:


传统上,您甚至可以使用数组,而不必担心内存问题,因为javascript数组传统上是作为稀疏数组实现的。但现代浏览器可能会将某些数组优化为实际数组,因此如果您真的想节省内存,请使用对象。

虽然这里已经有两个很好的答案,但如果您觉得使用包含许多未填充元素的数组“偏执”,我想特别回答您的问题

JS数组很棘手,因为它们可能显示为“线性列表”和“字典”。如果将它们用作“字典”,则实际上使用的是JS
Object
properties。所以你在混合内容

试试这个:

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
只是一个信息。如果数组被视为整数寻址的元素链,则它是为了保持数组一致而设置的上边框。这里,
长度
与“分配的内存大小”无关。没有“空的存储位置”

对于一些后续问题,您也可以尝试以下更改:

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"
您始终可以使用
数组
上下文以及
对象
上下文

这会产生一些后果,例如如何循环数组(这已经是一个巨大的讨论,jQuery的
。each()
增加了一些问题:-))

使用经典的
for
循环,必须检查元素是否
未定义。(首先取下上述键“2015”)

(变量i=0;i)的


数组不一定像您认为的JavaScript中那样工作。您可以使用数字(将转换为字符串)作为属性名,但您应该首先初始化数组:
data[2015]=[]
所有的答案和评论都非常有用……感谢大家帮助理解javascript数组!这里没有JSON对象。JSON是一个字符串。您还应该使用
定义属性。请注意
数据[2015]
也适用于上述对象。试试看。这个答案非常通俗,对我理解js中的数组有很大帮助。感谢发布!感谢您的反馈-很高兴提供帮助:-)
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"  <<<