2014-03-07 63 views
0

我有一個奇怪的問題。我需要一個具有數字索引的多維javascript數組,例如: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

*「...因爲如果unique = 85481726,那麼javascript將在85481726th索引處新的空數組之前用85481725未定義的元素填充數組。」*不,它贏得'噸。 JavaScript標準數組是**稀疏**。在索引85481725處設置一個元素會生成一個** 1 **條目的數組,並且「長度」值爲85481726.就是這樣。更多:[*數組的神話*](http://blog.niftysnippets.org/2011/01/myth-of-arrays.html) –

+0

@Jon:實際上,它確實如此,因爲OP最終會帶有鍵單引號開頭和結尾;但稍後OP會嘗試檢索值*,而不用單引號。沒有匹配的密鑰,因此他/她沒有得到回值。 –

+0

@ T.J.Crowder:Argh。我很好奇,很快在FF控制檯上做了一個小測試,但我完全搞不懂它 - 'x ['2'] = 1; alert(x [2]);'而不是正確的'x [「'2'」] = 1'。不知道我在想什麼。我的藉口是brainfart。 – Jon

回答

1

如果您打算使用大多數稀疏的數組,請改爲使用哈希表。

ListUI_col_Orders = {}; 

那麼你的索引將是一個關鍵,所以你不必擔心所有的間隙元素佔用空間:

例如,如下設置您的變量。

+1

爲什麼?這是[所有標準的JavaScript數組無論如何](http://blog.niftysnippets.org/2011/01/myth-of-arrays.html),你什麼也得不到。 –

+0

真的嗎?我認爲它會以不同的方式實現哈希和數組,就像大多數其他語言一樣。雖然授予,這是JavaScript ...如果你可以指向我的參考,我會做這方面的盡職調查,並刪除我的答案。 –

+0

@ R:有[規範](http://www.ecma-international.org/ecma-262/5.1/#sec-15.4)(這也與我上面的文章鏈接)。 ;-) –

1

...因爲如果unique = 85481726那麼javascript將在85481726th索引處的新空數組之前用85481725未定義的元素填充數組。

不,它不會。 JavaScript標準數組很稀疏。在索引85481725處設置一個元素將生成一個包含一個條目的數組,以及一個值85481726。就是這樣。更多:A myth of arrays

問題是您試圖使用與您用來存儲密鑰不同的密鑰來檢索信息。在存儲的時候,您使用的是與在它單引號鍵(實際上的鍵),在此行的代碼:

MyArray ["'"+unique+"'"] = new Array(); 

unique85481726。那麼這條線是相同的:

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.這不僅僅是詭辯,這是實際的技術真相。你可以告訴使用inhasOwnProperty

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等構造函數創建。那些是真正的陣列。 (許多引擎已經擁有它們)。