2016-04-19 11 views
1

私は結果を2次元配列に出力し、各要素に1を加えるという問題に取り組んでいます。Array.prototype.fill()はfillとは別のものです

私はテストケースを作成することができます。次のように私は、行くように私は配列を埋める場合:

var a = [[], [], [] ,[] ,[], []]; 
var d1, d2; 
for (d1 = 0; d1 < 6; d1++) { 
    for (d2 = 0; d2 < 6; d2++) { 
     a[d1][d2] = (a[d1][d2]) ? (a[d1][d2]) + 1 : 1; 
    } 
} 

私はarray.prototype.fill(使用してアレイを事前移入場合、すべての値が、しかし1ある2次元配列を取得します)、次のように:

var a = new Array(6).fill(new Array(6).fill(0)); 
var d1, d2; 
for (d1 = 0; d1 < 6; d1++) { 
    for (d2 = 0; d2 < 6; d2++) { 
     a[d1][d2] += 1; 
    } 
} 

私は6次元の完全な2D配列を取得します。私がa[d1][d2] += 1を古いa[d1][d2] = (a[d1][d2]) ? (a[d1][d2]) + 1 : 1;と置き換えても(0と未定義の両方が偽であるので、まだ動作するはずです)、私はまだ6を取得します。

私の知る限りでは、コードは各要素をループして前の値に1を加えるだけです。要素に何度も触れてはならないので、すべて1にする必要があります。私が事前に配列を埋めるかどうかは重要ではありません。

どこが私の理解に失敗しましたか?

+0

ポップクイズを:どのように多くの新しい配列オブジェクトの行を行い、 '新しいアレイ(6).fill(新しいアレイ(6).fill(0) ); '作成する? (ヒント:行に表示される 'new Array'呼び出しの数と同じです。)(ヒント#2:7未満です':) ') – apsillers

答えて

5

Array.fillは、スタティックの値を持つ開始インデックスから終了インデックスまでの配列のすべての要素を埋めるために使用されます。

これは残念なことに、新しい配列などの要素を渡すと、実際には同じ要素への参照が多く格納されます。言い換えれば、aは6つのサイズの6つの配列で埋められません。 aは、への6つのポインタ、サイズ6の同じ配列で満たされています。

あなたが簡単にあなたのデベロッパーコンソールでこれを確認することができます。

var a = new Array(6).fill(new Array(6).fill(0)); 
a 
>>> [Array[6], Array[6], Array[6], Array[6], Array[6], Array[6]] 
a[0] 
>>> [0, 0, 0, 0, 0, 0] 
a[1] 
>>> [0, 0, 0, 0, 0, 0] 
a[0][1] = 1 
a[0] 
>>> [0, 1, 0, 0, 0, 0] 
a[1] 
>>> [0, 1, 0, 0, 0, 0] 
+1

つまり、OPの利点のために、それぞれ'a [d1]'のバージョンは常に正確に同じ配列*なので、その6つの値はそれぞれ6倍になります。 – apsillers

+0

@apsillers Igeddit、Igeddit。私は緑色の小切手を入れていませんが、他の誰かが来て、それをもっと簡単に、あるいはよりエレガントに説明したり、私が意図した通りに働くものを含んでいる場合は、少し待っています。 – trlkly

+1

外側の配列に 'fill'以外のものを使用するだけです。私は 'map'または' Array.from'を提案します。 – Hamms

関連する問題