JavaScriptで2次元配列を作成するにはどうすればよいですか?


1136

私はオンラインで読んでいて、それが不可能だと言う人もいれば、それが可能だと言って、例を挙げたり、他の人がその例に反論したりするところもあります。

  1. JavaScriptで2次元配列を宣言するにはどうすればよいですか?(それが可能であると仮定)

  2. メンバーにアクセスするにはどうすればよいですか?(myArray[0][1]またはmyArray[0,1]?)


21
やや面倒な定義を仮定すると、JavaScriptで2D配列を作成することは技術的に不可能です。しかし、配列の配列を作成することはできますが、これは同じことです。
IJケネディ

10
FYI ...を使用して配列に配列を追加するとvar arr2D = new Array(5).fill(new Array(3));、Array(5)の各要素は同じArray(3)を指します。したがって、forループを使用してサブ配列に動的にデータを入力するのが最適です。
Josh Stribling 2016年

51
a = Array(5).fill(0).map(x => Array(10).fill(0))
Longfei Wu 2017

2
言い換えると、それはラムダ式や上記のLongfei Wuのコメントのように最初に配列を0で埋め、次にマップ関数をラムダで使用するため、配列の各インデックスをfill呼び出さないでくださいnew Array(3)各要素を新しい配列で埋めます。fill関数は、配列に指定したとおりに入力するだけです。それは理にかなっていますか?詳細はmap機能、次を参照してください。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
ジョシュStribling

2
@kalehmannは問題ありませんmeta.stackoverflow.com/a/252017/2311074If the new question is a better question or has better answers, then vote to close the old one as a duplicate of the new one.
Adam

回答:


1231

var items = [
  [1, 2],
  [3, 4],
  [5, 6]
];
console.log(items[0][0]); // 1
console.log(items[0][1]); // 2
console.log(items[1][0]); // 3
console.log(items[1][1]); // 4
console.log(items);


32
この方法で大きな多次元配列を初期化することは困難です。ただし、この関数を使用して、次元をパラメーターとして指定して、空の多次元を作成できます。
アンダーソングリーン

2
@AndersonGreenマルチDアレイソリューションに興味のある方へのリンクについて言及したのは良いことですが、質問とBallsacian1の回答は「マルチD」アレイではなく「2D」アレイに関するものです
evilReiko

すべてを確認する必要があります...たとえば、alert(items [0] [1]); // 2など
Dois

1
@SashikaXPは、これは0以外の最初の指標のために動作しない
マイケルFranzl

1
問題は、2次元配列を宣言する方法です。これは私が探していたものであり、これと、宣言と初期化の違いを識別できない次の答えを見つけました。既知の長さまたは無制限の宣言もありますが、どちらも説明されていません。
2016年

444

配列内の各項目を配列にするだけです。

var x = new Array(10);

for (var i = 0; i < x.length; i++) {
  x[i] = new Array(3);
}

console.log(x);


6
キーと値に文字列などを使用できますか?myArray ['Book'] ['item1']?
ディエゴ

42
@ディエゴ、はい、しかしそれは配列が意図されているものではありません。キーが文字列の場合は、オブジェクトを使用することをお勧めします。
マシュークランリー

10
これは、動的なサイズの配列に実装できるため、受け入れられた回答よりもこの例が好きです。たとえばnew Array(size)sizeは変数です。
可変性主義

1
動作しません-割り当てエラー。それが役に立たない場合、この答えはどのようにして280のいいねを得ましたか?
Gargo

1
これは機能しています。ありがとうございます。Gargo jsfiddle.net/matasoy/oetw73sj
matasoy

198

activaの答えと同様に、n次元配列を作成する関数を次に示します。

function createArray(length) {
    var arr = new Array(length || 0),
        i = length;

    if (arguments.length > 1) {
        var args = Array.prototype.slice.call(arguments, 1);
        while(i--) arr[length-1 - i] = createArray.apply(this, args);
    }

    return arr;
}

createArray();     // [] or new Array()

createArray(2);    // new Array(2)

createArray(3, 2); // [new Array(2),
                   //  new Array(2),
                   //  new Array(2)]

2
これは4次元配列を作成できますか?
trusktr '19年

4
@trusktr:はい、(メモリ制約内で)必要なだけディメンションを作成できます。4次元の長さを渡すだけです。たとえば、var array = createArray(2, 3, 4, 5);
Matthew Crumley、

4
ベストアンサー!ただし、0または1パラメーター(役に立たない)で使用することはお勧めしません
Apolo

2
@BritishDeveloper はい。これは、5の各長さ(d)配列である:[[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]],[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]]]
haykam

2
@haykamあなたの時間を無駄にして申し訳ありません-私は皮肉でした:/
BritishDeveloper

84

JavaScriptには1次元配列しかありませんが、他の人が指摘するように、配列の配列を構築できます。

次の関数を使用して、固定次元の2次元配列を作成できます。

function Create2DArray(rows) {
  var arr = [];

  for (var i=0;i<rows;i++) {
     arr[i] = [];
  }

  return arr;
}

使用する前に配列のサイズを指定する必要がないため、列の数はそれほど重要ではありません。

その後、単に呼び出すことができます:

var arr = Create2DArray(100);

arr[50][2] = 5;
arr[70][5] = 7454;
// ...

カードのデッキを表す2次元配列を作成します。これは、カードの値を保持する2次元配列となり、次にスーツになります。それを行う最も簡単な方法は何でしょうか。
Doug Hauf 2014

1
function Create2DArray(rows){var arr = []; for(var i = 0; i <rows; i ++){arr [i] = []; } arrを返します。} function print(deck){for(t = 1; t <= 4; t ++){for(i = 1; i <= 13; i ++){document.writeln(deck [t] [i]); }}}機能fillDeck(d){for(t = 1; t <= 4; t ++){myCardDeck [t] [1] = t; for(i = 1; i <= 13; i ++){myCardDeck [t] [i] = i; }}} function loadCardDeck(){var myCardDeck = Create2DArray(13); fillDeck(myCardDeck); print(myCardDeck); }
Doug Hauf

2
@Doug:実際には、2つの属性を持つオブジェクトの1次元配列が必要です。変数デッキ= []; デッキ[0] = {面:1、スーツ: 'H'};
TeasingDart

@DougHaufそれは縮小された2D配列ですか?:P:D
2016年

78

最も簡単な方法:

var myArray = [[]];

29
これは2次元配列です
マウリツィオインデンマーク2013年

15
ええ、それに注意してください。myArray [0] [whatever]の割り当ては問題ありませんが、myArray [1] [whatever]を設定してみると、myArray [1]が未定義であると文句が表示されます。
フィリップ

22
@フィリップあなたはmyArray[1]=[];割り当てる前に設定する必要がありますmyArray[1][0]=5;
182764125216

4
@AndersonGreenが書いたように、これは「空の1x1配列を作成」しないことに注意してください。「1x0」配列(つまり、0列の配列を含む1行)を作成します。 myArray.length == 1myArray[0].length == 0。次に、「真に空の」「0x0」配列をコピーすると、誤った結果が返されます。
JonBrave 2016年

3
@ 182764125216それは私にとってその日の知識でした。ありがとう:)
th3pirat3

76

空の2次元配列(1行)を作成する方法

Array.from(Array(2), () => new Array(4))

図2および4は、それぞれ第1および第2の次元である。

ここではArray.from、配列のようなparamと各要素のオプションのマッピングを使用できるを使用しています。

Array.from(arrayLike [、mapFn [、thisArg]])

var arr = Array.from(Array(2), () => new Array(4));
arr[0][0] = 'foo';
console.info(arr);

同じトリックを使用して、1 ... Nを含むJavaScript配列を作成できます


または(ただし、を使用すると 12%効率低下しますn = 10,000

Array(2).fill(null).map(() => Array(4))

パフォーマンスの低下は、実行するために最初のディメンション値を初期化する必要があるという事実に伴います.map。それを忘れないでください Arrayあなたを介してそれを注文するまでポジションを割り当てません.fillか、直接値を代入。

var arr = Array(2).fill(null).map(() => Array(4));
arr[0][0] = 'foo';
console.info(arr);


ファローアップ

正しいように見えますが、問題がある方法は次のとおりです。

 Array(2).fill(Array(4)); // BAD! Rows are copied by reference

明らかに望ましい2次元配列([ [ <4 empty items> ], [ <4 empty items> ] ])は返されますが、最初の次元配列が参照によってコピーされているという問題があります。つまり、arr[0][0] = 'foo'実際には1行ではなく2行が変更されます。

var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo';
console.info(arr);
console.info(arr[0][0], arr[1][0]);


私はこれをお勧めします:Array.from({length:5}, () => [])
vsync

ここでは主観的ですが、この答え(その中の最初と2番目)は、簡潔、高速、そしてモダンの最良のバランスのようです。
ブレイディダウリング

@zurfyx任意のアイデア、または誰かが知っていますか、なぜWebstormはこれについて不平を言っていますか?array.fromが値を未定義のままにしているようで、スニペットがここでstackoverflowで
正常

46

不可能だと言う人がいる理由は、2次元配列は実際には単なる配列の配列だからです。ここでの他のコメントは、JavaScriptで2次元配列を作成する完全に有効な方法を提供しますが、最も純粋な観点は、オブジェクトの1次元配列を持ち、これらの各オブジェクトは2つの要素で構成される1次元配列になるということです。

だから、それが意見の対立の原因です。


41
いいえ、ちがいます。一部の言語では、のような多次元配列を使用できますstring[3,5] = "foo";。Y軸は実際にはX軸の子ではないため、一部のシナリオではこれがより適切な方法です。
Rafael Soares

3
基礎となるマシンコードに到達すると、次元> 1のすべてのテンソルは、どの言語でも、配列の配列になります。キャッシュの最適化の理由から、これを覚えておくことは価値があります。数値計算に真剣に対応する適切な言語であれば、メモリ内の多次元構造を調整して、最も使用頻度の高い次元が連続して格納されるようにすることができます。PythonのNumpy、Fortran、Cが思い浮かびます。実際、この理由から、次元を複数の構造に削減する価値がある場合があります。
Thomas Browne 2014年

コンピュータには次元の概念はありません。メモリアドレスという1つの次元しかありません。それ以外はすべて、プログラマーのための表記上の装飾です。
TeasingDart

3
@ThomasBrowneそうではありません。「配列の配列」は、内部配列のサイズ(それらは異なる場合があります)と、内部配列が格納されている場所を見つけるために参照解除する別のポインタのために、ある程度のストレージを必要とします。「まともな」言語では、多次元配列はギザギザの配列とは異なります。それは、それら自体が異なるデータ構造であるためです。(紛らわしい部分は、Cアレイは、それらが[A] [B]構文でインデックス付けしているにもかかわらず、多次元であることである。)
polkovnikov.ph

33

プッシュの使用を示す人はほとんどいません。
何か新しいものをもたらすために、いくつかの値でマトリックスを初期化する方法を示します。例:0または空の文字列 ""。
10要素の配列がある場合、JavaScriptでは最後のインデックスが9になることを思い出してください!

function matrix( rows, cols, defaultValue){

  var arr = [];

  // Creates all lines:
  for(var i=0; i < rows; i++){

      // Creates an empty line
      arr.push([]);

      // Adds cols to the empty line:
      arr[i].push( new Array(cols));

      for(var j=0; j < cols; j++){
        // Initializes:
        arr[i][j] = defaultValue;
      }
  }

return arr;
}

使用例:

x = matrix( 2 , 3,''); // 2 lines, 3 cols filled with empty string
y = matrix( 10, 5, 0);// 10 lines, 5 cols filled with 0

最後のfor(デフォルト値を設定する)をプロシージャから削除して書き込みますm=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m));-非常にストレージマトリックス(ネストが多すぎます)を取得します-最後のfor-defaultValueステップでそれを修復しますが、前にネストされていない配列を使用するようにプロシージャを書き直すことができると思いますデフォルト値の設定。
カミルキエチェフスキ

27

ツーライナー:

var a = []; 
while(a.push([]) < 10);

配列で満たされた長さ10の配列aを生成します。(プッシュは配列に要素を追加し、新しい長さを返します)


13
ワンライナー:for (var a=[]; a.push([])<10;);
Bergi 14

@Bergiは変数を次の行で定義しますか?
StinkyCat

1
@StinkyCat:はい、そうvarです。常に関数スコープです。
Bergi

私は知っているので、あなたのワンライナーはこの場合役に立たない:あなたは「そのメンバーにアクセスする」ことはできない(質問をチェック)
StinkyCat

1
domenukkと@Bergi、どちらも正しいです。私はそれを試しました、そして、私は後にアクセスすることができます。謝罪します!そして、ありがとう、これは私にとってのレッスンかもしれません;)
StinkyCat

24

正直な答えは

var nrows = ~~(Math.random() * 10);
var ncols = ~~(Math.random() * 10);
console.log(`rows:${nrows}`);
console.log(`cols:${ncols}`);
var matrix = new Array(nrows).fill(0).map(row => new Array(ncols).fill(0));
console.log(matrix);


fillは浅いコピーコンストラクターを使用するため、行を直接埋めることはできません。したがって、すべての行が同じメモリを共有します。ここでは、各行が共有される方法を示す例を示します(他の回答から取得)。

// DON'T do this: each row in arr, is shared
var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo'; // also modifies arr[1][0]
console.info(arr);

これが一番上になるはずです。私は似たようなものを使用しましたArray.apply(null, Array(nrows))が、これははるかにエレガントです。
dimiguel 2016年

これは私の最後のコメントについてです... Internet ExplorerとOperaはをサポートしていませんfill。これは、大部分のブラウザーでは機能しません。
dimiguel 2016年

この場合、@ dimgl Fillは定数マップを使用してエミュレートできます:Array(nrows).map(() => 0)または、Array(nrows).map(function(){ return 0; });
Conor O'Brien

20

最も簡単な方法:

var arr  = [];

var arr1 = ['00','01'];
var arr2 = ['10','11'];
var arr3 = ['20','21'];

arr.push(arr1);
arr.push(arr2);
arr.push(arr3);

alert(arr[0][1]); // '01'
alert(arr[1][1]); // '11'
alert(arr[2][0]); // '20'

18

これは私が達成したものです:

var appVar = [[]];
appVar[0][4] = "bineesh";
appVar[0][5] = "kumar";
console.log(appVar[0][4] + appVar[0][5]);
console.log(appVar);

これは私にbineeshkumarを綴った


2
親配列の0インデックスのみにアクセスできることに注意してください。これは、たとえばappVar [5] [9] = 10;を設定できるほど便利ではありません。...これを使用すると、「未定義のプロパティ "9"を設定できません」が表示されます。
RaisinBranCrunch 2017

しかしappVar[1][4] = "bineesh";、間違っています、それをどのように解決しますか?
ガンク

16

2次元配列は、1次元配列と同じ方法で作成されます。そして、あなたはそれらのようにそれらにアクセスしますarray[0][1]

var arr = [1, 2, [3, 4], 5];

alert (arr[2][1]); //alerts "4"

14

誰かがこれに答えたかどうかはわかりませんが、これはかなりうまくいきました-

var array = [[,],[,]]

例えば:

var a = [[1,2],[3,4]]

たとえば、2次元配列の場合。


これを動的に行うにはどうすればよいですか?サイズの異なる内部配列が必要です。
2014年

3
余分なコンマvar array = [[],[]]は必要ありません。
カヤトースト2015年

13

javaScriptで2D配列を作成するには、まず配列を作成してから、要素として配列を追加します。このメソッドは、指定された数の行と列を持つ2D配列を返します。

function Create2DArray(rows,columns) {
   var x = new Array(rows);
   for (var i = 0; i < rows; i++) {
       x[i] = new Array(columns);
   }
   return x;
}

配列を作成するには、次のようにこのメソッドを使用します。

var array = Create2DArray(10,20);

2
それがどのように機能し、なぜそれが問題を解決するかを示すいくつかの説明情報を回答に追加してください。これは、将来このページを見つけた他のユーザーに役立ちます
バナナの私たちの男'25年

JavaScriptで特定の数の列で事前初期化された配列が必要になるのはいつですか?[]配列のn番目の要素にもアクセスできます。
domenukk

関数が大文字のCで始まることに気づきました。これは(特定の規則により)関数コンストラクターであり、新しいキーワードと共に使用することを示唆しています。非常にマイナーで多少意見が分かれているかもしれませんが、大文字ではない単語をお勧めします。
ハチ

12

アドレス可能なすべてのインデックスと値がnullに設定された非スパースの「2D」配列(x、y)を作成するには:

let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null))) 

ボーナス「3D」配列(x、y、z)

let 3Darray = new Array(x).fill(null).map(item=>(new Array(y).fill(null)).map(item=>Array(z).fill(null)))

これに関するバリエーションや修正は、コメントやさまざまな時点でこの質問への回答として言及されていますが、実際の回答ではないため、ここに追加します。

(他のほとんどの回答と同様に)これはO(x * y)時間の複雑さがあるため、非常に大きな配列にはおそらく適さないことに注意してください。


1
fill同じ値を設定するので注意してください。null`objectに変更すると、すべての列で同じオブジェクトになります
Stanislav Mayorov

@StanislavMayorovあなただけの同じトリックを使用し、各セルの値を設定したい場合:let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
haykam

10

配列内包表記を使用する

JavaScript 1.7以降では、配列内包表記を使用して2次元配列を作成できます。また、配列を埋めながらエントリをフィルタリングまたは操作したり、ループを使用したりする必要はありません。

var rows = [1, 2, 3];
var cols = ["a", "b", "c", "d"];

var grid = [ for (r of rows) [ for (c of cols) r+c ] ];

/* 
         grid = [
            ["1a","1b","1c","1d"],
            ["2a","2b","2c","2d"],
            ["3a","3b","3c","3d"]
         ]
*/

あなたがn x m望む任意の配列を作成し、それをデフォルト値で満たすことができます

var default = 0;  // your 2d array will be filled with this value
var n_dim = 2;
var m_dim = 7; 

var arr = [ for (n of Array(n_dim)) [ for (m of Array(m_dim) default ]] 
/* 
         arr = [
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0],
         ]
*/

その他の例とドキュメントはここにあります

これはまだ標準機能ではないことに注意してください


ここで簡単なグーグルチェック... for
うん

1
どのブラウザでもサポートされていません- ここ
KamilKiełczewski

10

ライナー愛好家のためのArray.from()

// creates 8x8 array filed with "0"    
const arr2d = Array.from({ length: 8 }, () => Array.from({ length: 8 }, () => "0"))

別のもの(dmitry_romanovによるコメントから)はArray()。fill()を使用します

// creates 8x8 array filed with "0"    
const arr2d = Array(8).fill(0).map(() => Array(8).fill("0"))

ES6 + スプレッドオペレーターの使用(InspiredJW 回答による「インスピレーション」:))

// same as above just a little shorter
const arr2d = [...Array(8)].map(() => Array(8).fill("0"))

2
0最初のfill()関数で削除できます:const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Jinsong Li

8

私のアプローチは@Bineeshの回答に非常に似ていますが、より一般的なアプローチです。

次のようにdouble配列を宣言できます。

var myDoubleArray = [[]];

また、次の方法でコンテンツを保存およびアクセスします。

var testArray1 = [9,8]
var testArray2 = [3,5,7,9,10]
var testArray3 = {"test":123}
var index = 0;

myDoubleArray[index++] = testArray1;
myDoubleArray[index++] = testArray2;
myDoubleArray[index++] = testArray3;

console.log(myDoubleArray[0],myDoubleArray[1][3], myDoubleArray[2]['test'],) 

これは期待される出力を印刷します

[ 9, 8 ] 9 123

7

以下が最も簡単な方法です:

var array1 = [[]];   
array1[0][100] = 5; 

alert(array1[0][100]);
alert(array1.length);
alert(array1[0].length);

array1[1][100] = 666;スローUncaught TypeError: Cannot set property '100' of undefined
カミルキエチェフスキ

@KamilKiełczewskiあなたが正しい、これは配列の最初の配列に対してのみ開始するように見えます。2番目の場合はarray1[1][100] = 666;、実行する前に、これを行う必要がありますarray1[1] = [];
GMsoF

7

パフォーマンス

今日2020.02.05私は選択したソリューションについて、Chrome v79.0、Safari v13.0.4、Firefox v72.0のMacOs HighSierra 10.13.6でテストを実行します。

初期化されていない2次元配列の結論

  • 難解なソリューション{}/arr[[i,j]](N)は、大小の配列で最も高速であり、大きなスパース配列に適しているようです
  • に基づくソリューション for-[]/while(A、G)には高速であり、小規模なアレイに適しています。
  • ソリューション for-[](B、C)は高速で、大きなアレイに適しています
  • に基づくソリューション Array..map/from/fill(I、J、K、L、M)には、小さな配列ではかなり遅く、大きな配列ではかなり速い
  • 驚くべきことに、for-Array(n)(B、C)はサファリでよりもはるかに遅いfor-[](A)
  • 驚くほど for-[](A)大きな配列ではすべてのブラウザで遅い
  • ソリューションKは、すべてのブラウザーの小さな配列では遅い
  • ソリューションA、E、Gは、すべてのブラウザーの大きなアレイでは遅い
  • ソリューションMは、すべてのブラウザーのすべてのアレイで最も遅い

ここに画像の説明を入力してください

初期化された2Dアレイの結論

  • for/while(A、B、C、D、E、G)に基づくソリューションは、すべてのブラウザーの小さなアレイに対して最速/非常に高速です
  • for(A、B、C、E)に基づくソリューションは、すべてのブラウザーの大きなアレイに対して最速/非常に高速です
  • Array..map/from/fill(I、J、K、L、M)に基づくソリューションは、すべてのブラウザーの小さなアレイに対して中速または低速です
  • 大きなアレイのソリューションF、G、H、I、J、K、Lは、クロムとサファリでは中程度または高速ですが、Firefoxでは最も低速です。
  • 難解なソリューション{}/arr[[i,j]](N)は、すべてのブラウザーの大小のアレイで最も遅い

ここに画像の説明を入力してください

詳細

出力配列を満たさない(初期化する)ソリューションのテスト

ソリューションの速度をテストします

  • 小さな配列(12要素)- ここでマシン上でテストを実行できます
  • 大きな配列(100万要素)の配列- ここでマシン上でテストを実行できます

出力配列を満たす(初期化する)ソリューションのテスト

ソリューションの速度をテストします

  • 小さな配列(12要素)- ここでマシン上でテストを実行できます
  • 大きな配列(100万要素)の配列- ここでマシン上でテストを実行できます

ここに画像の説明を入力してください


6

JavaScriptは2次元配列をサポートしていません。代わりに、配列を別の配列内に格納し、アクセスする配列の位置に応じて、その配列からデータをフェッチします。配列の列挙はZEROから始まることに注意してください。

コード例:

/* Two dimensional array that's 5 x 5 

       C0 C1 C2 C3 C4 
    R0[1][1][1][1][1] 
    R1[1][1][1][1][1] 
    R2[1][1][1][1][1] 
    R3[1][1][1][1][1] 
    R4[1][1][1][1][1] 
*/

var row0 = [1,1,1,1,1],
    row1 = [1,1,1,1,1],
    row2 = [1,1,1,1,1],
    row3 = [1,1,1,1,1],
    row4 = [1,1,1,1,1];

var table = [row0,row1,row2,row3,row4];
console.log(table[0][0]); // Get the first item in the array

6

var playList = [
  ['I Did It My Way', 'Frank Sinatra'],
  ['Respect', 'Aretha Franklin'],
  ['Imagine', 'John Lennon'],
  ['Born to Run', 'Bruce Springsteen'],
  ['Louie Louie', 'The Kingsmen'],
  ['Maybellene', 'Chuck Berry']
];

function print(message) {
  document.write(message);
}

function printSongs( songs ) {
  var listHTML;
  listHTML = '<ol>';
  for ( var i = 0; i < songs.length; i += 1) {
    listHTML += '<li>' + songs[i][0] + ' by ' + songs[i][1] + '</li>';
  }
  listHTML += '</ol>';
  print(listHTML);
}

printSongs(playList);


6

ES6 +、ES2015 +はこれをさらに簡単な方法で実行できます


trueで満たされた3 x 2配列の作成

[...Array(3)].map(item => Array(2).fill(true))

告白する必要があります 私はあなたの答え「を採用した」とに追加鉱山、ワンライナーコレクション。
my-

5

必要に応じて「レコード」を追加し、更新してデータベースに送信してさらに処理する前に必要な計算を実行できるように、柔軟な配列関数を作成する必要がありました。ここにコードがあります、それが役に立てば幸いです:)

function Add2List(clmn1, clmn2, clmn3) {
    aColumns.push(clmn1,clmn2,clmn3); // Creates array with "record"
    aLine.splice(aPos, 0,aColumns);  // Inserts new "record" at position aPos in main array
    aColumns = [];    // Resets temporary array
    aPos++ // Increments position not to overlap previous "records"
}

バグを自由に最適化および/または指摘してください:)


どうaLine.push([clmn1, clmn2, clmn3]);ですか?
Pimp Trizkit 2018年

5

これが、2次元配列を作成するための簡単な方法です。

function createArray(x, y) {
    return Array.apply(null, Array(x)).map(e => Array(y));
}

この関数を簡単にES5関数に変換することもできます。

function createArray(x, y) {
    return Array.apply(null, Array(x)).map(function(e) {
        return Array(y);
    });
}

これが機能する理由:new Array(n)コンストラクターはのプロトタイプを使用してオブジェクトを作成し、そのオブジェクトにをArray.prototype割り当てますlength。その結果、配列が作成されません。実際のメンバーが不足しているため、Array.prototype.map関数を実行できません。

ただし、のように、コンストラクターに複数の引数を指定すると、コンストラクターArray(1, 2, 3, 4)argumentsオブジェクトを使用してインスタンスを作成し、Array正しくます。

このような理由から、我々は使用することができますArray.apply(null, Array(x))ので、apply関数がコンストラクタに引数を分散します。明確にするために、行うことArray.apply(null, Array(3))は行うことと同等Array(null, null, null)です。

これで、実際にデータが入力された配列が作成されたのでmap、2番目のレイヤー(y)を呼び出して作成するだけです。


5

1つ下で、5x5マトリックスを作成し、それらで埋めます null

var md = [];
for(var i=0; i<5; i++) {
    md.push(new Array(5).fill(null));
}

console.log(md);


3
この答えは間違っています。スロットを埋める同じ配列を持つ配列を作成します。md[1][0] = 3 残りの要素もすべて更新されます
Qiang

5

実行時にのみ既知の配列の列のサイズは、動的な2D配列を作成するために次の方法を使用できます。

var num = '123456';
var row = 3; // Known at run time
var col = 2; // Known at run time
var i = 0;

var array2D = [[]];
for(var r = 0; r < row; ++r)
{
    array2D[r] = [];
    for(var c = 0; c < col; ++c)
    {
        array2D[r][c] = num[i++];
    }
}
console.log(array2D); 
// [[ '1', '2' ], 
//  [ '3', '4' ], 
//  [ '5', '6' ]]

console.log(array2D[2][1]); // 6

4

2D配列のサイズを事前に定義することを強制しない別の解決策があり、それは非常に簡潔です。

var table = {}
table[[1,2]] = 3 // Notice the double [[ and ]]
console.log(table[[1,2]]) // -> 3

これは、オブジェクトの文字列キー[1,2]として使用される文字列に変換されるため機能します。table


この答えだけでも、JavaScriptの「多次元」配列であるジャンクを台無しにしたくありません。非常にエレガントな解決策があっても、これは、他の誰もが実際に多次元配列を作成していないことも示しています。 JavaScriptの「配列」。この回答は、任意のサイズと内容の疑似無限サイズ、無限次元配列を完全に「シミュレート」します。他のすべての再帰およびループベースの回答では、作成できる配列構造のサイズにはるかに低い上限があります。そして、作成速度は、これらのより大きな構造の主要な問題になります。
Pimp Trizkit 2018年

シミュレート事前充填する代わりに、この行を使用しますvar table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
ポンTrizkit

オブジェクトでArray2Dを「エミュレート」するための素晴らしい創造的な方法:)
KamilKiełczewski

4

4x6アレイを作成するには、これを実行するだけです

const x = [...Array(6)].map(elem => new Array(4))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.