0

我有一个对象和一个数组:

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
}

以上不起作用的任何原因?数组仍在undefinedfor 循环运行之后。

4

3 回答 3

2

我也觉得p应该[1,6]也是?由于您使用它来引用 object 中的键m

于 2012-06-16T03:12:55.870 回答
1

发生错误是因为您有以下声明:

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

但是m属性是:

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

所以 inp[1]让你的程序被读取m["2"],但它没有“2”属性。请改用此代码:

var p = ["1","6"];
于 2012-06-16T03:05:56.547 回答
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都保留了顺序。

于 2012-06-16T03:19:03.497 回答