2012-04-13 5 views
4

高インデックスの配列セルを設定する前に、そのセルの前にセルを設定しない状況があります。空のセルはJavaScriptのスパース配列にどのように格納されますか?

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

このような配列はどのようにメモリに格納されていますか?未定義の値ごとに領域が割り当てられていますか?

私の実際のプロジェクトでは、非常に大きなインデックスを使用している可能性があります。たとえば、私はセル500-800と900-1000を設定するかもしれません。私はこれらの空でないセルをループし、そのインデックスを認識する必要があるため、ハッシュを使用することはできません。私はこのような配列の断片化が空のセルに1トンのメモリを消費するかどうかを知りたい。

+1

「{}」を使用できないのはわかりません。 'for(i in obj) 'ループを使って、すべてのプロパティをループすることができます。 – zzzzBov

+0

ハッシュテーブルを使用できないのはなぜですか?最大のインデックスを知っていれば、 'for'ループを使用することができます。要素がハッシュテーブルにあり、それを取得して処理するか、そうではなく、次のループの繰り返しに移ります。 –

+1

各値にスペースが割り当てられている場合、 'var foo = []; foo [999999999] = "uh oh"; 'は大きなメモリ割り当てを引き起こします。それはそうではないので、そうではありません。 – Phrogz

答えて

1

、あなたはまだ繰り返すことができます:Phrogzがコメントしたよう

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 

、それは、配列の宣言されていない要素のために割り当てません。要素値を明示的に未定義に設定した場合(たとえばarr[somenum] = undefined;)、

+0

実際にログプリントを表示するには(〜500)、必要なファイアバグの設定を調整する必要があります。私はFirefoxのアドレスバーの 'about:config'に行き、' extensionsを設定すると思います。firebug.console.logLimit'を少なくとも '10950'に設定します(例を考慮して) – vol7ron

1

これらの空でないセルをループしてインデックスを認識する必要があるため、ハッシュは使用できません。

for (x in ...)言語構成の問題点を教えてください。 vol7ronのコメント収容する

EDITED

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

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

a)私はお勧めします['hasOwnProperty'はもはやデフォルトでは使用できなくなりました](http://phrogz.net/death-to-hasownproperty)。 b)この解決法の問題点は、オブジェクトのキーを反復することは保証された順序を持たず、OPの質問に基づいて、おそらくジョーゴがそれらを順番に訪れることを望んでいる/必要と思われることである。 – Phrogz

+0

@aefxx:Phrogzが書いた 'defineProperty'について私は気づいていませんでしたが、私はそれでもまだ100%売れていません。何人かのブラウザに問題があるかもしれないと言いました。 (IE7/FF3以降) – vol7ron

0

をあなたはおそらく、単純にこのような変数とアクセスマップ内の最大インデックスを格納する必要があります

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

その後マップの(相対的な)妥協点と、未設定のインデックスをループする機能があります。 aefxxの答えにストラッピング

関連する問題