2012-02-28 5 views
1

配列eleを持っていて、別の配列arreleのコピーを設定して、その配列を戻したいとします。私が持っているJavaScript関数は次のとおりです:JavaScript 2D配列の集団で予期しない出力が発生する

function foo(n) { 
    var arr = new Array(n); 
    var ele = [0,1]; 

    for(var i=0;i<n;i++) { 
     arr[i] = ele; 
    } 
    return arr; 
} 

foo(3)、私が望む出力は[[0,1],[0,1],[0,1]]ですが、出力は[#1=[0, 1], #1#, #1#](Firefoxのウェブコンソールを使用)です。 [[0,1],[0,1],[0,1]]:私が代わりにarr直接[0,1]を取り込むときは、

function fooNew(n) { 
    var arr = new Array(n); 

    for(var i=0;i<n;i++) { 
     arr[i] = [0,1]; 
    } 
    return arr; 
} 

のように私はfooNew(3)の正しい出力を取得します。なぜ私の元の機能fooは、fooNewと同じ出力を出さないのですか?つまり、なぜarreleを割り当ててarr[i]に代入することができず、eleの内容を直接arr[i]に割り当てて、それを入力しなければならないのですか?

更新======:フェリックスクリングの役に立つ答えに照らして、そしていくつかのグーグルでの後、私はスライス(0)を使用することによって、あなたはARRにELEのコピーを置くことができることを見出した[I ]を参照してください。だから、FOOの次のような変形は、所望の出力が得られます:

function foo(n) { 
    var arr = new Array(n); 
    var ele = [0,1]; 

    for(var i=0;i<n;i++) { 
     arr[i] = ele.slice(0); 
    } 

    return arr; 
} 
+2

コメントとして、Firefox/FirebugとChromeの両方で正しく表示されます。最初の例では、SAMEの 'ele'配列への参照を' arr'のすべての位置に代入しています。だから 'x = foo(3); x [0] .push(2); '、x上のすべての配列は3つの要素を持ちます(実際には同じ配列なので) – julioolvr

+0

私のために働きます。 Chromeでは、Firefox(Firebug)&Node.js @ julio.olvrは、 'ele'を割り当てるときには注意してください。'{}'オブジェクトのような配列は、コレクションへのポインタです。だから、 'var x = [1,2,3]'、 'var y = x'、そして' y [0] = 9'の場合、xは '[9,2,3]'になります。 – Marshall

答えて

4

実際には、Firebugのの出力は、このような状況†では非常に便利です。参照を示す、配列[0, 1]のプレースホルダです

[#1=[0, 1], #1#, #1#] 
// ^----------^----^ 

#1(または#1#):それはあなたの結果の配列のすべての要素が同じ配列を参照することを示しています。

これは配列の配列ですが、Firebugとはまったく異なっています。

私はこれがあなたが何をしたいかわからない。したがって、あなたは割り当てる必要があり、結果は

[[5,1], [5,1], [5,1]] 

になり

result[0][0] = 5; 

私はあなたが配列が互いに独立しているようにしたいと仮定します。たとえば、場合は、最初の配列の最初の要素を変更します毎回新しい配列。これは第2のケースであなたがすることです。


†:しかし、必ずしもすべてが見えるとは限りません。オブジェクトの状態(たとえば)は、ツールがそれをどのように表現するかとはかなり異なる場合があります。 Here is an article about such a case(自己宣伝して申し訳ありません)、この問題はFirebugでは修正されていますが、Chromeでは修正されていません(afaik)。

+0

ありがとう!私は表記法 "#1#"を作るべきか分からなかった(Googleはあなたにそのような文字列を照会させないだろう、と思われる)が、これは理にかなっている。 –

+0

私は通常Firebugを使用しませんが、その出力は本当に賢明で便利です。説明をありがとう! – MartinodF

+0

@ user1238742:あなたは歓迎です:)もしあなたが助けられたら、この答えを受け入れられたとマークしてください。 –

関連する問題