2013-01-24 94 views
2

我已經聲明瞭一個二維陣列,像這樣:的Javascript二維陣列

a = [[]] 

然而,當我嘗試使用除0以外的第一維指標以得到第二維值,它不工作:

a[1][0] = "foo" //returns error 

有沒有解決這個更好的方式比手動定義每一個需要作爲數組的索引,即:

a[1] = []; 
a[2] = []; 
a[3] = []; 
//et cetera 
+3

'a [0] [0] = x'應該有效。它返回什麼錯誤? – 0x499602D2

+0

'a [0] [0] = x'將起作用,但'a [1] [0] = x'不會。 – Pointy

+0

我的不好,我的意思是指數不是0.讓我糾正一下。 – Bluefire

回答

8

N維數組的例子中不存在這個問題, JavaScript - 你只需要將包含數組的數組作爲元素。

因爲a = [[]];聲明瞭一個數組,一個元素,這恰好也是一個數組。因此a[0]是內部數組,但a[1]不存在,因爲您從未聲明它。正確地申報了「二維數組」最簡單的方法是使用一個循環:

var outerArray = []; 
var numInternalArrays = 5; 
for (var i = 0; i < numInternalArrays; i++) { 
    outerArray[i] = []; 
} 
2

如果我理解正確,請使用循環:

for (var i = y; i--; a[i] = []); 
+0

我又壞了:我的意思是說,如果有其他方式繞過它,而不是以任何方式定義它們。我想知道JS中是否有一個魔術技巧可以幫助你。 – Bluefire

+0

@Bluefire我仍然不完全明白你想要做什麼。我的回答沒有幫助嗎? – 0x499602D2

+0

它的確如此,我只是想知道是否有一個本地函數可以做到這一點。 – Bluefire

1

JavaScript中沒有多維數組。
你在做什麼是一個數組數組,但最外面的數組只有一個元素(即元素0),其值是另一個數組。所以[1](或者更一般的a [1] [x])是無效的,因爲最外層的數組只有一個元素。
所以你可以做一個[0] [x] =「foo」,但不能反過來。所以你可以用for循環初始化數組,或者做一些類似var a = [[] [] [] [] []];

4
a = [[]] 

這是一個數組,第一個項目是一個數組。這是爲什麼索引到第一個項目仍然有效(a [0] [0])。

如果您要訪問的第二個項目作爲一個數組,你需要創建數組作爲

a = [[],[]] 

How can I create a two dimensional array in JavaScript?

1

你可以有數組的數組開始在:

var a = []; // start with the column array 

然後,當你想要把我們可以在位置[i][j]中調用'i'行索引和'j'列索引。

if (!a[i]) { // check for row existing 
    a[i] = []; // .. and create it if not 
} 
a[i][j] = 'foo'; // put something in the array cell 

請注意,這隻適用於我們在創建它之後總是將某些東西放入新行數組中。如果你在裏面放置0或者「」而不是'foo',它可能不起作用。

在javascript中有很多東西是'假'包括'空'和'未定義'和'0',我只是不知道是否一個空數組或一個元素是空的數組字符串被視爲錯誤。所以你必須做一些試驗,準確地檢測缺失的行數組,以便將其添加進去。

5

如果你知道root數組應該有多少個元素有,你可以做這樣的事情:

var arr = 
    (Math.pow(2,10)-1).toString(2) // Binary string of 1s. Its length being 10 
    .split('')      // Create an array from this string 
    .map(function(){return [];}); // Map a new empty array to each index 

console.log(arr);     // [[],[],[],[],[],[],[],[],[],[]] 

這樣可以完成同樣的事情:

for(var arr = [], i=10; i--; arr[i]=[]); 

不需要聲明arr以外的for-loop,因爲javascript沒有塊範圍,它將被添加到它的執行範圍。

+3

這是有史以來最好的答案,我在閱讀本書之前並不瞭解JavaScript,而不是閱讀本書。我曾經是一個不尊重長輩的悲慘的人,現在我發現了這個尊重。謝謝Shmiddty,謝謝你把我的生活變成了現實!你的行爲不會被忽視! –

+1

你也可以使用jQuery提供答案嗎?我聽說它非常好,更好地解決了這些問題。 –

+2

通過閱讀這個答案,我生活的清晰度提高了十倍。 –