2012-04-13 55 views
4

我有一個情況,我可以設置高折射率的一個陣列單元之前不將其設置的任何細胞。在JavaScript中如何將空單元存儲在稀疏數組中?

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

這樣的數組是如何存儲在內存中的?是否爲每個未定義的值分配了空間?

在我的實際項目中,我可以使用非常大的指標。例如,我可以設置單元格500-800和900-1000。我不能使用散列,因爲我需要遍歷這些非空單元並知道它們的索引。我想知道如果像這樣對數組進行分段將爲空單元耗盡大量內存。

+1

我不知道我跟着,你爲什麼不能使用'{}'的情況?你仍然可以使用'for(i in obj)'循環遍歷所有的屬性。 – zzzzBov 2012-04-13 18:09:35

+0

爲什麼你不能使用散列表?如果你知道最大的索引,你仍然可以使用'for'循環。元素位於散列表中,您可以檢索並處理它,或者它不是,然後轉到下一個循環迭代。 – 2012-04-13 18:10:09

+1

如果爲每個值分配了空間,則var foo = []; foo [999999999] =「呃哦」;'會導致大量的內存分配。它不是,所以不是。的 – Phrogz 2012-04-13 18:13:57

回答

1

打包到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;

+0

爲了實際看到日誌打印過去(〜500),你需要調整必要的螢火蟲設置。我想在Firefox的地址欄中輸入'about:config'並設置'extensions。firebug.console.logLimit'到至少'10950'(考慮這個例子) – vol7ron 2012-04-14 17:07:51

1

我不能使用散列,因爲我需要通過這些非空單元循環並知道它們的索引。

for (x in ...)語言結構有什麼問題?

EDITED,以適應vol7ron的評論:

var x = {2: "foo", 999: "bar"}; 

for (var n in x) { 
    if (x.hasOwnProperty(n)) { 
     console.log(n); 
     console.log(x[n]); 
    } 
} 
+1

一)我建議['hasOwnProperty'不再適合默認使用](http://phrogz.net/death-to-hasownproperty)。 B)這種解決方案的問題在於遍歷對象的鍵沒有保證的順序,並根據OP的問題似乎可能是喬喬想/需要訪問,以便他們。 – Phrogz 2012-04-13 18:26:42

+0

@aefxx:我不知道'defineProperty'的是Phrogz寫的,雖然我仍然把它賣給不是100%,因爲正如他所說的一些瀏覽器中可能存在的問題(我,我拿最低的共同主流瀏覽器分母的做法 - 因爲IE7/FF3) – vol7ron 2012-04-13 18:44:47

0

你或許應該簡單地存儲在一個變量的最大索引和訪問您的地圖是這樣的:

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

然後您將擁有地圖的(相對)緊湊性以及循環未設置索引的能力。