javascript数组索引大整数

时间:2014-03-07 14:34:11

标签: javascript arrays

我有一个奇怪的问题。我需要一个具有数字索引的多维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将在85481726th索引处的新空数组之前用85481725未定义元素填充数组。

我的问题是,如果我再次生成唯一身份,我将无法再访问该阵列:

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

任何提示?

2 个答案:

答案 0 :(得分:1)

如果你打算使用一个主要是稀疏的数组,那么请使用哈希表。

例如,按如下方式设置变量:

ListUI_col_Orders = {};

然后您的索引将成为关键,因此您不必担心占用空间的所有插页元素。

答案 1 :(得分:1)

  

...因为如果unique = 85481726那么javascript将在85481726th索引的新空数组之前用85481725未定义元素填充数组。

不,它不会。 JavaScript标准数组很稀疏。在索引85481725处设置元素会导致数组包含一个条目,length值为85481726。就是这样。更多:A myth of arrays

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

MyArray ["'"+unique+"'"] = new Array();

unique85481726。那条线就相当于:

MyArray ["'85481726'"] = new Array();

请注意,您使用的密钥(双引号之间的文本)在开头和结尾都有'。实际的属性名称中包含引号。由于它不符合数组索引的定义,因此不会影响length。它是一个非索引对象属性。 (如何将属性添加到不是数组索引的数组?数组实际上不是数组,请参阅上面的链接。)

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

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数组本质上是稀疏的。添加具有大索引的条目不会在其前面创建数千个undefined条目。

所有这些都说,除非你需要数组的“数组”,否则你可以只使用一个对象。如果使用它们的功能,数组很有用;如果你没有使用他们的数组功能,只需使用一个对象。


有关数组稀疏性的更多信息:请考虑以下代码:

var a = [];
a[9] = "testing";
console.log(a.length); // 10

虽然length属性为10,但数组中只有一个条目,索引为9.这不仅仅是诡辩,而是实际的技术真相。您可以使用inhasOwnProperty

来判断
console.log(a.hasOwnProperty(3)); // false
console.log("3" in a);            // false

当您尝试检索不存在的数组元素时,该检索的结果为undefined。但这并不意味着那里有一个元素;没有。只是尝试检索不存在的元素会返回undefined。如果您尝试检索该对象没有的任何其他属性,则会得到相同的内容:

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

最后注意事项:使用[]new Array()创建的标准数组都是如此。在下一个规范中,JavaScript正在获得 true 数组,这些数组是使用Int32Array之类的构造函数创建的。那些是真正的数组。 (许多引擎已经拥有它们。)