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]か?オブジェクト内のキーを参照するために使用しているためm

于 2012-06-16T03:12:55.870 に答える
1

この宣言があるため、エラーが発生します。

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

ただし、mプロパティは次のとおりです。

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

したがって、p[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"]

2 番目のループで:

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..inloop を使用して、オブジェクトのキーを反復処理できます。

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

for..inキーの順序を保持することを保証するものではないことに注意してください。for..inただし、 doの既存の実装はすべて順序を保持します。

于 2012-06-16T03:19:03.497 に答える