2012-06-16 79 views
0

在對象中的每個鍵中一個的返回值我有一個對象和陣列:for循環

m = { "1": ["2", "3"], "6": ["4", "5"] }; 
var p = ["1", "6"]; 

我有一個for循環:

for (var i = 0; i < p.length; i++) { 
    // Return an array that is the value of a key in m, for each key specified in p 
    var array = m[p[i]]; 

    // do stuff with array 
} 

任何原因沒有任何作用? for循環運行後,陣列仍爲undefined。發生

+0

m = {「1」:[「2」,「3」],「6」,[「4」,「5」]};'這是無效的json,你有''6「 「4」,「5」]'沒有鑰匙。也許你的意思是這個'm = [{「1」:[「2」,「3」]},「6」,[「4」,「5」];' –

+0

@ samy.vilar:沒人說是JSON,但你說的對'6''是正確的。對象語法無效。我猜這是一個錯誤的問題。 – 2012-06-16 03:19:35

+0

@amnotiam JSON代表Javascript Object Notation,他在做什麼?聲明一個對象。 (我認爲,自從它錯之後我就不知道了) –

回答

0

您聲明的m = { "1": ["2", "3"], "6", ["4", "5"] };給我的語法錯誤。我假設你的意思是m = { "1": ["2", "3"], "6": ["4", "5"] };

p.length是2,所以你有2個迭代的循環。在表達式中的第一次迭代值:

i = 0 
p[i] = "1" 
m[p[i]] = m["1"] = ["2", "3"] 

在第二循環:

i = 1 
p[i] = "2" 
m[p[i]] = m["2"] (undefined) 

你只有m["1"]m["6"],沒有m["2"]。這就是爲什麼array在上次迭代中未定義的原因。所以它在循環後仍然未定義。

您可以糾正m聲明如下:

m = { "1": ["2", "3"], "2": ["4", "5"] }; 

現在,您將在循環後得到array = ["4", "5"]

我可以建議你不要在字符串中存儲整數。使用2而不是"2"。否則可能會導致將來出現錯誤。例如,2 + 2 = 4"2" + "2" = "22"。如果您從其他代碼獲得"2",請使用parseInt將其轉換爲正常編號。

此外,您不必使用鍵列表創建p變量。你可以簡單地使用for..in遍歷你的對象的鑰匙迭代:

m = { 1: [2, 3], 2: [4, 5] }; 
for(i in m) { 
    var array = m[i]; 
    //do stuff 
} 

記住for..in並不保證保存鍵的順序。但是,for..in的所有現有實現都可以保持順序。

+0

謝謝,特別是關於'for(i in m)'的提示。鍵是整數的原因是因爲我使用它們作爲ID,而ID不一定是整數。我可能應該在例子中使用'a'和'b'作爲鍵。 – chrishenn

+0

請注意,「for-in」不保證訂單。如果您需要強制執行特定順序,則應使用問題中使用的Array技術。 – 2012-06-16 03:30:49

+0

使用整數作爲對象鍵是確定的。我說的是「[2」,「3」],它應該是[2,3]。 –

1

的錯誤,因爲你有這樣的聲明:

var p = ["1","2"]; 

m屬性是:

m = { 
    "1": [2,3], 
    "6": [4,5] 
} 

所以p[1],使你的程序讀取m["2"],但它不具有「2 「財產。 使用此代碼來代替:

var p = ["1","6"]; 
+0

也許不會在對象的屬性中引用引號。 – Sethen

+1

@MarkLinus:所有對象屬性都是字符串,包括數組屬性。 – 2012-06-16 03:14:58

+0

@MarkLinus有時在對象的屬性中引用引號會產生不必要的副作用,因此,如果不需要,您可能不應該這樣做。 – Sethen

2

而且我覺得p應該[1,6]呢?因爲您正在使用它來引用對象m中的鍵。

+0

+1,錯誤在於循環以'array = m [「2」]'結尾,這是未定義的,因爲'm'沒有鍵'2'。 – apsillers