我有一个奇怪的问题。我需要一个具有数字索引的多维 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 将在第 85481726 个索引处的新空数组之前用 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
有什么建议吗?
最佳答案
...because if the
unique = 85481726
then javascript will fill the array with 85481725 undefined elements before the the new empty array at the 85481726th index.
不,不会。 JavaScript 标准数组是稀疏的。设置索引 85481725
处的元素会生成一个包含一个条目的数组,且 length
值为 85481726
。这就是它的全部作用。更多:A myth of arrays
问题在于您尝试使用与存储信息时使用的 key 不同的 key 来检索信息。存储时,您在这行代码中使用带有单引号的键(实际上在键中):
MyArray ["'"+unique+"'"] = new Array();
假设唯一
是85481726
。该行相当于:
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'
(带单引号),这是您最初使用的 key 。由于您没有使用相同的 key ,因此您没有获得该值。
要么使用一致的引号,要么(更好)根本不使用引号。不用担心数组 length
是一个很大的数字,JavaScript 数组本质上是稀疏的。添加具有大索引的条目不会在其前面创建数千个 未定义
条目。
综上所述,除非您需要数组的“数组性”,否则您可以只使用对象。如果您使用数组的功能,数组就会很有用;如果您不使用它们的数组功能,只需使用对象即可。
<小时/>有关数组稀疏性的更多信息:考虑以下代码:
var a = [];
a[9] = "testing";
console.log(a.length); // 10
尽管 length
属性为 10
,但该数组中只有一个条目,位于索引 9 处。这不仅仅是诡辩,而是实际的技术真理。您可以使用 in
或 hasOwnProperty
来判断:
console.log(a.hasOwnProperty(3)); // false
console.log("3" in a); // false
当您尝试检索不存在的数组元素时,检索结果为未定义
。但这并不意味着那里有一个元素。没有。只是尝试检索不存在的元素会返回 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
等构造函数创建的 true 数组。这些是真正的数组。 (许多引擎已经拥有它们。)
关于javascript 使用大整数进行数组索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22252933/