簡體   English   中英

javascript數組索引大整數

[英]javascript array indexing with large integers

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

有小費嗎?

如果您打算使用主要稀疏的數組,那么請使用哈希表。

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

ListUI_col_Orders = {};

那么你的索引將是一個關鍵,所以你不必擔心占用空間的所有插頁式元素。

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

不,它不會。 JavaScript標准數組很稀疏。 在索引85481725處設置元素85481725導致數組具有一個條目,並且length值為85481726 就是這樣。 更多: 陣列的神話

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

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正在獲得真正的數組,使用像Int32Array等構造函數創建。 那些是真正的數組。 (許多引擎已經擁有它們。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM