javascript 使用大整数进行数组索引

标签 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 将在第 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 处。这不仅仅是诡辩,而是实际的技术真理。您可以使用 inhasOwnProperty 来判断:

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/

相关文章:

javascript - 通过 Express/Node.js 中的重定向将错误消息传递给模板

javascript - 如何使用 CommonsChunkPlugin、UglifyJsPlugin 和 SourceMapDevToolPlugin 为单个 block 获取正确的源映射文件?

javascript - 如何在 C3.js 中隐藏堆积条形图上的条形图

javascript - 我正在尝试将数组写入 HTML,但它始终显示为未定义

php - 将字符串数组转换为对象数组

java - 克隆一个 int[] ——有人有更快的建议吗?

java - 如何创建仅包含偶数的数组的副本?

php - 循环遍历php中的表单输入数组

javascript - 我可以使用 JavaScript 在 Chrome 中显示 HTML 元素吗?

javascript - React Native - Redux 状态正在更新,但组件 View 未正确更新