繁体   English   中英

javascript数组索引大整数

[英]javascript array indexing with large integers

我有一个奇怪的问题。 我需要一个具有数字索引的多维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

有小费吗?

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

例如,设置您的变量如下:

ListUI_col_Orders = {};

那么你的索引将是一个关键,所以你不必担心占用空间的所有插页式元素。

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

不,它不会。 JavaScript标准数组很稀疏。 在索引85481725处设置元素85481725导致数组具有一个条目,并且length值为85481726 就是这样。 更多: 阵列的神话

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

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正在获得真正的数组,使用像Int32Array等构造函数创建。 那些是真正的数组。 (许多引擎已经拥有它们。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM