如何在 JavaScript 中的稀疏数组中存储空单元格

How are empty cells stored in a sparse array in JavaScript?

本文关键字:数组 存储 单元格 JavaScript      更新时间:2023-09-26

>我遇到一种情况,我可能正在设置高索引的数组单元格,而没有设置它之前的任何单元格。

>>> var arr = [];
undefined
>>> arr[5] = 'value';
"filled"
>>> arr
[undefined, undefined, undefined, undefined, undefined, "filled"]

这样的数组如何存储在内存中?是否为每个未定义的值分配了空间?

在我的实际项目中,我可能会使用非常大的索引。例如,我可以设置单元格 500-800 和 900-1000。我不能使用哈希,因为我需要遍历这些非空单元格并注意它们的索引。我想知道像这样对数组进行分段是否会为空单元格占用大量内存。

结合

aefxx 的答案,您仍然可以迭代:

var obj = {500: "foo",  10923: "bar"};
var max = 0;
for (var key in obj)
   max=key>max?key:(max||key);         // get max key
for (var i=0; i<=max; i++)
   console.log(obj[i]);                // output even the undefined

正如 Phrogz 评论的那样,它不会为数组中未声明的元素分配。 如果您明确将元素值设置为 undefined,我不确定是否是这种情况(例如 arr[somenum] = undefined;

我不能使用哈希,因为我需要遍历这些非空单元格并注意它们的索引。

for (x in ...)语言结构有什么问题?

编辑以适应vol7ron的评论:

var x = {2: "foo", 999: "bar"};
for ( var n in x ) {
    if ( x.hasOwnProperty(n) ) {
        console.log(n);
        console.log(x[n]);
    }
}  

您可能应该简单地将最大索引存储在变量中,然后像这样访问您的地图:

for (var i=0; i<=maxIndex; i++) {
 console.log(myMap[i]);
}

然后,您将拥有地图的(相对)兼容性以及循环访问未设置索引的能力。