我有一个奇怪的问题。我需要一个具有数字索引的多维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
任何提示?
答案 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();
说unique
是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'
(带单引号),这是您最初使用的密钥。由于您没有使用相同的密钥,因此您没有获得该值。
要么使用一致的引号,要么(更好)不要使用引号。不要担心数组length
是一个大数字,JavaScript数组本质上是稀疏的。添加具有大索引的条目不会在其前面创建数千个undefined
条目。
所有这些都说,除非你需要数组的“数组”,否则你可以只使用一个对象。如果使用它们的功能,数组很有用;如果你没有使用他们的数组功能,只需使用一个对象。
有关数组稀疏性的更多信息:请考虑以下代码:
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
。但这并不意味着那里有一个元素;没有。只是尝试检索不存在的元素会返回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
之类的构造函数创建的。那些是真正的数组。 (许多引擎已经拥有它们。)