1

奇妙な問題があります。Javascriptを使用して多次元配列からいくつかの値を取得しようとしていますが、奇妙な出力が得られます。

これが私のコードです:

foo = [['3','4'],['5','6']];

for (bar in foo) {

    baz = bar[0];
    alert(baz);

    qux = bar[1];
    alert(qux);

}

上記の出力は次のとおりです。

// These are all alerts, by the way
0,undefined,1,undefined,$,f,$,c,e,a,c,l,c,l,i,i,n,a,s,l,i,c,o,a,p,g,e,g,e,i,n,c,o,e,r,e,m,f,l,p,i,h,e,r,g       

誰かが何が起こっているのか教えてもらえますか?

これが問題のjsFiddleです:http://jsfiddle.net/Jey6w/

編集:

これが別のjsFiddleで、「インセプション」の別のレイヤーがあります:http: //jsfiddle.net/8vyGq/

出力:

// Again, these are all alerts, and * signifies undefined
0**1**$ff$ceaacllcllinnassliicooappgeegeeinncooerremmfllpiiheergg 
4

2 に答える 2

6

JavaScriptfor ... inループは、値ではなく、オブジェクト プロパティの名前を提供します。

for ... in実数配列には使用しないでください。数値インデックスまたは を使用します.forEach()

出力を取得する理由は複雑で面白くありません。なぜなら、そうすべきではないからです。しかし、ここから始めましょう。プロパティ名は、 によって文字列に強制されますfor ... in。したがって、最初の反復では、"bar" は文字列 "0" であり、("0")[0]"0" となります。これ("0")[1]undefined、"bar" が 1 文字の文字列であるためです。

その後、for ... inループは、どこかから継承された他のいくつかのプロパティによろめきます。おそらく、プロトタイプか何かを使用しています。次に、ループは、他のすべてのプロパティの名前の最初の 2 文字を警告します。

于 2012-08-09T22:06:36.287 に答える
1

bar私は間違っているかもしれませんが、オブジェクト内のプロパティへの参照を返すという事実によるものだと思います。セレクターを変更すると、foo[bar][0]うまくいきます。

foo = [['3','4'],['5','6']];

for (bar in foo) {
    alert(foo[bar][0]);
    alert(foo[bar][1]);
}​

オブジェクトが単なる多次元配列である場合、for in不要なプロパティを選択する可能性があるため、ステートメントを使用しないように配列を変更します。私は古き良き時代に固執しますfor(start, stop, increment)

foo = [['3','4'],['5','6']];

for (i = 0; i < foo.length; i++) {
    alert(foo[i][0]);
    alert(foo[i][1]);
}​

更新-jQuery

jQuery の.eachメソッドについての言及があったので、それをどのように利用できるかの例も投稿したいと思いました。jQuery の each メソッドはindexInArray、 との 2 つのオプション パラメータを渡しますvalueOfElement。さらに、jQueryのドキュメントにも次のように記載されています

値はキーワードを介してアクセスすることもできますthisが、Javascript は、この値が単純な文字列または数値であっても、常にオブジェクトとしてラップします。

これを念頭に置いて、次の jQuery ( jsFiddle )を使用して、前の例と同じ結果を得ることができます。

var foo = [['3','4'],['5','6']];

$.each(foo, function() {
    // 'this' is the context of the current item within the array
    alert(this[0]);
    alert(this[1]);
}​)​
于 2012-08-09T22:08:51.880 に答える