使用大整数的javascript数组索引

使用大整数的javascript数组索引,javascript,arrays,Javascript,Arrays,我有一个奇怪的问题。我需要一个具有数字索引的多维javascript数组,例如: MyArray = new Array(); $(".list-ui-wrapper").each(function(){ var unique = $(this).attr('id').replace(/[^\d.]/g,''); MyArray ["'"+unique+"'"] = new Array(); }); 唯一值是一个8位整数。因此,如果我不将其包装在引号中

我有一个奇怪的问题。我需要一个具有数字索引的多维javascript数组,例如:

  MyArray = new Array();

  $(".list-ui-wrapper").each(function(){
       var unique = $(this).attr('id').replace(/[^\d.]/g,'');
       MyArray ["'"+unique+"'"] = new Array();
  });
唯一值是一个8位整数。因此,如果我不将其包装在引号中,ListUI_col_orders数组将变得非常大,因为如果unique=85481726,javascript将在数组中填充85481725个未定义的元素,然后在85481726索引处创建新的空数组

我的问题是,如果以后我再次生成unique,我将无法再访问阵列:

var unique = $(this).attr('id').replace(/[^\d.]/g,'');
console.log(MyArray [unique]); // undefined
console.log(MyArray ['"'+unique+'"']); // undefined
console.log(MyArray [unique.toString()]); // undefined

有什么提示吗?

如果您打算使用一个基本上是稀疏的数组,那么请使用哈希表

例如,设置变量如下:

ListUI_col_Orders = {};
然后,索引将是一个关键,因此您不必担心所有间隙元素占用空间

…因为如果
unique=85481726
则javascript将在85481726索引处的新空数组之前,用85481725个未定义的元素填充数组

不,不会的。JavaScript标准数组是稀疏的。在索引
85481725
处设置元素将生成一个包含一个条目的数组,并且
length
值为
85481726
。这就是它的全部功能。更多:

问题是,您试图使用与存储信息的密钥不同的密钥检索信息。存储时,在这行代码中使用一个带有单引号的键(实际上是在键中):

MyArray ["'"+unique+"'"] = new Array();
unique
85481726
。这条线相当于:

MyArray ["'85481726'"] = new Array();
请注意,您正在使用的键(双引号之间的文本)的开头和结尾都有
。实际属性名称中包含这些引号。因为它不适合数组索引的定义,所以它不影响
长度
。它是一个非索引对象属性。(如何将属性添加到非数组索引的数组中?数组不是真正的数组,请参见上面的链接。)

稍后,在尝试检索值时,您永远不会使用该键:

var unique = $(this).attr('id').replace(/[^\d.]/g,'');
console.log(MyArray [unique]); // undefined
console.log(MyArray ['"'+unique+'"']); // undefined
console.log(MyArray [unique.toString()]); // undefined
您在那里试过的键是
85481726
的“85481726”
(带双引号)和
85481726
。请注意,您从未尝试过
'85481726'
(带单引号),这是您最初使用的密钥。因为您没有使用相同的键,所以无法获得值

要么使用一致的引号,要么(更好)根本不使用引号。不要担心数组
length
是一个很大的数字,JavaScript数组本身就是稀疏的。添加具有大索引的条目不会在其前面创建数千个未定义的
条目

所有这些都说明了,除非你需要数组的“数组性”,你可以用一个对象来代替。如果使用阵列的功能,则阵列非常有用;如果不使用它们的阵列功能,只需使用对象即可


更多关于数组的稀疏性:考虑这个代码:

var a = [];
a[9] = "testing";
console.log(a.length); // 10
尽管
length
属性是
10
,但数组中只有一个条目,即索引9。这不仅仅是诡辩,而是真实的技术真相。您可以使用
中的
hasOwnProperty
来判断:

console.log(a.hasOwnProperty(3)); // false
console.log("3" in a);            // false
当您尝试检索不存在的数组元素时,检索的结果是
未定义
。但这并不意味着那里有一个元素;没有。只是尝试检索不存在的元素会返回未定义的
。如果您尝试检索对象没有的任何其他属性,则会得到相同的结果:

var a = [];
a[9] = "testing";
console.log(a[0]);     // undefined
console.log(a[200]);   // undefined
console.log(a["foo"]); // undefined

最后一点注意:对于使用
[]
新建数组()
创建的标准数组,所有这些都是正确的。在下一个规范中,JavaScript获得了真正的数组,使用
Int32Array
等构造函数创建。这些是真实的数组。(许多发动机已经有了它们。)

为什么?就是说,你什么也得不到。真的吗?我认为它会以不同的方式实现哈希和数组,就像大多数其他语言一样。虽然这是理所当然的,但这是javascript。。。如果您能给我提供一份参考资料,我将对此进行尽职调查,并删除我的答案。@R:There's(这也是我上面文章的链接)。;-)浏览一下。。。没有看到任何明确说明这一点的东西。做了一个快速的控制台测试,结果和我预期的一样。初始化x[2](忽略0&1)将创建具有空值的元素0和1。同样,将x[2]与哈希一起使用也不会创建中间值。也许这取决于实现,但这对我来说已经足够了。我认为我的答案是正确的,我将保留它。谢谢。@R:不,它不依赖于实现,是的,规范对此很清楚。不要略读,阅读::-)spec语言非常密集,难以阅读,但它确实存在。证据:(来源:)。正如规范在相关章节的第一句中所说,JavaScript数组只是对一组特定属性名进行特殊处理的对象;具有神奇的
length
属性;并由
数组支持。原型
。因为如果unique=85481726,则javascript将在数组中填充85481725个未定义的元素,然后在85481726索引处创建新的空数组。JavaScript标准数组是稀疏的。在索引85481725处设置元素将生成一个包含一个条目的数组,其
长度
值为85481726。这就是它的全部功能。更多:@Jon:事实上是这样的,因为OP的开头和结尾都是带单引号的键;但随后OP尝试检索不带单引号的值。没有匹配的密钥,因此他/她无法返回值。@t.J.Crowder:Argh。我很好奇,很快在FF控制台上做了一个小测试,但我完全搞砸了--
x['2']=1;警报(x[2])
而不是正确的
x[“'2'”]=1
。不知道我在想什么。我的借口是放屁。