[英]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();
說unique
是85481726
。 那條線就相當於:
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處。這不僅僅是詭辯,而是實際的技術真相。 你可以告訴使用in
或hasOwnProperty
:
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.