2012-06-16 26 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