2013-05-19 91 views
7

我想初始化JavaScript中二維動態數組,它不限制元素(也許)像JavaScript的 - 控制二維動態數組

var dynamic = new Array(); 
dynamic[] = new Array(); 


後,我想增加價值的特殊array like like

dynamic[id].push(2); // id = 3, dynamic[3][0] = 2 
... 
dynamic[id].push(3); // id = 3, dynamic[3][1] = 3 
... 
dynamic[id].push(5); // id = 5, dynamic[5][0] = 5 

有可能嗎?我怎樣才能做到這一點,得益於

+0

你的意思是你想要在索引上得到一個新的空白數組,如果它不存在就自動嘗試訪問'dynamic'? – Dogbert

+0

您無法直接初始化二維數組。然而,你可以將數組元素push()到你的初始數組,以便有效地使它成爲2D。 – techfoobar

+0

你想擁有一個2D數組? –

回答

5

有一兩件事你可以做的是這樣的事情(jsfiddle):

var dynamic = []; 

dynamic.push = function (id, value) { 
    if (!this[id]) { 
     this[id] = []; 
    } 

    this[id].push(value); 
} 

dynamic.push(3, 2); 
dynamic.push(3, 3); 
dynamic.push(5, 5); 

。當然,這是可以做得更爲出色,但它跨越獲取點。就我個人而言,我會爲此寫一堂課。

編輯:還有,請記住,這將創建與具有一大堆undefined值,需要被照顧讀取的時候的高潛力的數組。此外,像這樣的孔陣列性能差(如果這會成爲一個問題 - 對於幾個,甚至幾百個值,這並不重要)。

+0

謝謝你,這很酷:) – DeLe

+0

@IngoBürk+1和謝謝你的答案可以請你發佈如何從這個多維數組檢索值例如:'我只需要像(3,2)和(3,3)那樣的id = 3值' –

0

覆蓋push可能不是最好的計劃。添加另一個方法/函數會使其更易於理解。有人讀push(1,3)可能會認爲你推1和3到陣列上,而不是3到第1項

var dynamic = []; 

dynamic.item = function(index) { 
    if (!dynamic[index]) { 
     dynamic[index] = []; 
    } 
    return dynamic[index]; 
} 

這將允許你做到以下幾點:

dynamic.item(1).push(1)

如果「項目「不存在,它在返回之前創建,這允許您在數組的兩個維度上使用所有數組方法。 (我相信)

你也可以通過將它添加到數組原型,讓它可以在所有數組上使用它,使其稍微更通用一些。

Array.prototype.item = function(index) { 
    if (!this[index]) { 
     this[index] = init; 
    } 
    return this[index]; 
} 
+0

是的,就像我說的那樣,有更好的方法。而且我還是更喜歡上課。 :) –