Bagaimana saya bisa membuat array dua dimensi dalam JavaScript?

1136

Saya telah membaca online dan beberapa tempat mengatakan itu tidak mungkin, beberapa mengatakan itu dan kemudian memberikan contoh dan yang lain menyangkal contohnya, dll.

  1. Bagaimana cara mendeklarasikan array 2 dimensi dalam JavaScript? (dengan asumsi itu mungkin)

  2. Bagaimana saya mengakses anggotanya? ( myArray[0][1]atau myArray[0,1]?)

Diego
sumber
21
Dengan asumsi definisi yang agak bertele-tele, secara teknis tidak mungkin untuk membuat array 2d dalam javascript. Tetapi Anda dapat membuat array array, yang sama dengan yang sama.
IJ Kennedy
10
FYI ... ketika Anda mengisi array dengan menggunakan lebih banyak array var arr2D = new Array(5).fill(new Array(3));, setiap elemen Array (5) akan mengarah ke Array yang sama (3). Jadi yang terbaik adalah menggunakan loop for untuk mengisi sub array secara dinamis.
Josh Stribling
51
a = Array(5).fill(0).map(x => Array(10).fill(0))
Longfei Wu
2
Dengan kata lain, filljangan memanggil new Array(3)setiap indeks array yang diisi, karena itu bukan ekspresi lambda atau apa pun, seperti komentar Longfei Wu di atas, yang awalnya mengisi array dengan 0, kemudian menggunakan fungsi peta dengan lambda untuk isi setiap elemen dengan array baru. Fungsi fill hanya mengisi array dengan tepat seperti yang Anda katakan. Apakah itu masuk akal? Untuk info lebih lanjut tentang mapfungsi ini, lihat: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Josh Stribling
2
@ kalehmann tidak apa-apa: meta.stackoverflow.com/a/252017/2311074 If 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

Jawaban:

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);

Ballsacian1
sumber
32
Akan sulit untuk menginisialisasi array multidimensi besar dengan cara ini. Namun, fungsi ini dapat digunakan untuk membuat multidimensi kosong, dengan dimensi yang ditentukan sebagai parameter.
Anderson Green
2
@AndersonGreen Ada baiknya Anda menyebutkan tautan untuk mereka yang tertarik dengan solusi multi-D array, tetapi pertanyaan dan jawaban Ballsacian1 adalah tentang array "2D", bukan array "multi-D"
evilReiko
Anda harus memeriksa semuanya ... mis. Waspada (item [0] [1]); // 2 dll.
Dois
1
@SashikaXP, ini tidak berfungsi untuk indeks pertama selain 0.
Michael Franzl
1
Pertanyaannya adalah bagaimana cara mendeklarasikan array dua dimensi. Itulah yang saya cari dan temukan jawaban ini dan berikut yang gagal membedakan perbedaan antara menyatakan dan menginisialisasi. Ada juga deklarasi dengan panjang yang diketahui atau tidak terbatas, yang keduanya tidak dibahas.
chris
444

Anda cukup membuat setiap item dalam array menjadi array.

var x = new Array(10);

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

console.log(x);

Sufian
sumber
6
Bisakah mereka menggunakan hal-hal seperti string untuk kunci dan nilai mereka? myArray ['Book'] ['item1']?
Diego
42
@ Diego, ya, tapi bukan itu yang dimaksudkan untuk array. Lebih baik menggunakan objek ketika kunci Anda adalah string.
Matthew Crumley
10
Saya suka contoh ini lebih baik daripada jawaban yang diterima karena ini dapat diimplementasikan untuk array berukuran dinamis, misalnya di new Array(size)mana sizevariabel.
Variadicism
1
tidak berfungsi - kesalahan pada tugas. Bagaimana jawaban ini mendapat 280 suka jika itu tidak berguna?
Gargo
1
Ini berhasil, terima kasih. Anda dapat melihat contoh Gargo jsfiddle.net/matasoy/oetw73sj
matasoy
198

Mirip dengan jawaban activa, berikut adalah fungsi untuk membuat array n-dimensi:

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)]
Matthew Crumley
sumber
2
Bisakah ini membuat array 4 dimensi?
trusktr
4
@trusktr: Ya, Anda dapat membuat dimensi sebanyak yang Anda inginkan (dalam batasan memori Anda). Cukup masukkan panjang empat dimensi. Sebagai contoh var array = createArray(2, 3, 4, 5);,.
Matthew Crumley
4
Jawaban Terbaik ! Namun, saya tidak akan merekomendasikan untuk menggunakannya dengan 0 atau 1 parameter (tidak berguna)
Apolo
2
@BritishDeveloper Ya. Ini adalah array 5D dengan panjang masing-masing pada 5:[[[[[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 maaf membuang-buang waktu Anda - Saya sedang sarkastik: /
BritishDeveloper
84

Javascript hanya memiliki array 1 dimensi, tetapi Anda dapat membangun array array, seperti yang ditunjukkan orang lain.

Fungsi berikut dapat digunakan untuk membangun array 2-dimensi tetap:

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

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

  return arr;
}

Jumlah kolom tidak terlalu penting, karena tidak diperlukan untuk menentukan ukuran array sebelum menggunakannya.

Maka Anda bisa langsung menelepon:

var arr = Create2DArray(100);

arr[50][2] = 5;
arr[70][5] = 7454;
// ...
Philippe Leybaert
sumber
saya ingin membuat array 2-dim yang akan mewakili setumpuk kartu. Yang akan menjadi array 2-dim yang memegang nilai kartu dan kemudian di setelan itu. Apa cara termudah untuk melakukannya.
Doug Hauf
1
function Create2DArray (rows) {var arr = []; untuk (var i = 0; i <rows; i ++) {arr [i] = []; } arr kembali; } fungsi cetak (deck) {untuk (t = 1; t <= 4; t ++) {untuk (i = 1; i <= 13; i ++) {document.writeln (deck [t] [i]); }}} fillDeck fucntion (d) {untuk (t = 1; t <= 4; t ++) {myCardDeck [t] [1] = t; untuk (i = 1; i <= 13; i ++) {myCardDeck [t] [i] = i; }}} function loadCardDeck () {var myCardDeck = Create2DArray (13); fillDeck (myCardDeck); print (myCardDeck); }
Doug Hauf
2
@ Doug: Anda sebenarnya menginginkan array objek satu dimensi dengan 2 atribut. var deck = []; deck [0] = {face: 1, suit: 'H'};
TeasingDart
@ DougHauf itu 2D-array yang diperkecil ?? : P: D
Mahi
78

Cara termudah:

var myArray = [[]];
Fred
sumber
29
yang merupakan array 2 dimensi
Maurizio In denmark
15
Ya, hati-hati dengan itu. Menetapkan myArray [0] [apa pun] baik-baik saja, tetapi cobalah dan atur myArray [1] [apa pun] dan mengeluh bahwa myArray [1] tidak ditentukan.
Philip
22
@ Pilip Anda harus mengatur myArray[1]=[];sebelum menetapkanmyArray[1][0]=5;
182764125216
4
Ketahuilah, ini tidak "membuat array 1x1 kosong" seperti yang ditulis oleh @AndersonGreen. Ini menciptakan array "1x0" (yaitu 1 baris yang berisi array dengan 0 kolom). myArray.length == 1dan myArray[0].length == 0. Yang kemudian memberikan hasil yang salah jika Anda kemudian menyalin array "benar-benar kosong" "0x0" ke dalamnya.
JonBrave
3
@ 182764125216 itu adalah pengetahuan tentang hari bagi saya. Terima kasih :)
th3pirat3
76

Cara membuat array dua dimensi kosong (satu baris)

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

2 dan 4 masing-masing menjadi dimensi pertama dan kedua.

Kami memanfaatkan Array.from, yang dapat mengambil param seperti array dan pemetaan opsional untuk masing-masing elemen.

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

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

Trik yang sama dapat digunakan untuk Membuat array JavaScript yang berisi 1 ... N


Atau (tetapi lebih tidak efisien 12% dengan n = 10,000)

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

Penurunan kinerja datang dengan fakta bahwa kita harus memiliki nilai dimensi pertama yang diinisialisasi untuk dijalankan .map. Ingatlah bahwa Arraytidak akan mengalokasikan posisi sampai Anda memesannya melalui .fillatau menentukan nilai langsung.

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


Mengikuti

Berikut adalah metode yang tampak benar, tetapi memiliki masalah .

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

Sementara itu mengembalikan array dua dimensi yang tampaknya diinginkan ( [ [ <4 empty items> ], [ <4 empty items> ] ]), ada tangkapan: array dimensi pertama telah disalin oleh referensi. Itu berarti arr[0][0] = 'foo'benar-benar akan mengubah dua baris, bukan satu.

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

zurfyx
sumber
Saya menyarankan ini:Array.from({length:5}, () => [])
vsync
Subyektif di sini tetapi jawaban ini (yang pertama dan kedua di dalamnya) tampaknya merupakan keseimbangan terbaik yang ringkas, cepat, dan modern.
Brady Dowling
@zurfyx ada ide, atau ada yang tahu, mengapa webstorm mengeluh tentang ini? Tampaknya array.from terus meninggalkan nilai-nilai sebagai tidak terdefinisi dan kemudian saya tidak dapat bekerja dengan array yang dibuat, meskipun potongan berjalan dengan baik di sini di stackoverflow
FaultyJuggler
46

Alasan beberapa orang mengatakan bahwa itu tidak mungkin adalah karena array dua dimensi sebenarnya hanya sebuah array array. Komentar lain di sini memberikan metode yang benar-benar valid untuk membuat array dua dimensi dalam JavaScript, tetapi sudut pandang paling murni adalah bahwa Anda memiliki array objek satu dimensi, masing-masing objek tersebut akan menjadi array satu dimensi yang terdiri dari dua elemen.

Jadi, itulah penyebab titik pandang yang saling bertentangan.

James Conigliaro
sumber
42
Tidak, tidak. Dalam beberapa bahasa, Anda dapat memiliki array multidimensi seperti string[3,5] = "foo";. Ini pendekatan yang lebih baik untuk beberapa skenario, karena sumbu Y sebenarnya bukan anak dari sumbu X.
Rafael Soares
3
Setelah sampai ke kode mesin yang mendasarinya, semua tensor dimensi> 1 adalah array array, bahasa apa pun yang kita bicarakan. Perlu diingat hal ini karena alasan optimasi cache. Setiap bahasa yang layak yang melayani komputasi numerik akan memungkinkan Anda untuk menyelaraskan struktur multidimensi Anda dalam memori sehingga dimensi yang paling sering Anda gunakan disimpan secara bersebelahan. Numpy, Fortran, dan C Python, muncul dalam pikiran. Memang ada kasus-kasus ketika itu bermanfaat untuk mengurangi dimensi menjadi beberapa struktur karena alasan ini.
Thomas Browne
Komputer tidak memiliki gagasan tentang dimensi. Hanya ada 1 dimensi, alamat memori. Yang lainnya adalah dekorasi notasi untuk kepentingan programmer.
TeasingDart
3
@ThomasBrowne Tidak juga. "Array array" memerlukan beberapa penyimpanan untuk ukuran array dalam (mereka mungkin berbeda) dan penunjuk referensi lain untuk menemukan tempat penyimpanan array batin. Dalam bahasa apa pun, array multidimentasi "baik" berbeda dari array bergerigi, karena mereka struktur data yang berbeda per se. (Dan bagian yang membingungkan adalah bahwa array C adalah multidimensional, meskipun mereka diindeks dengan sintaks [a] [b].)
polkovnikov.ph
33

Beberapa orang menunjukkan penggunaan push:
Untuk membawa sesuatu yang baru, saya akan menunjukkan kepada Anda bagaimana menginisialisasi matriks dengan beberapa nilai, contoh: 0 atau string kosong "".
Mengingatkan bahwa jika Anda memiliki array 10 elemen, dalam javascript indeks terakhir akan menjadi 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;
}

contoh penggunaan:

x = matrix( 2 , 3,''); // 2 lines, 3 cols filled with empty string
y = matrix( 10, 5, 0);// 10 lines, 5 cols filled with 0
Sergio Abreu
sumber
Saya menghapus yang terakhir for(yang menetapkan nilai default) dari prosedur Anda dan menulis m=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m));- dan kami mendapatkan matriks yang sangat strage (terlalu banyak bersarang) - Anda memperbaikinya pada langkah terakhir untuk-defaultValue, tapi saya pikir Anda dapat menulis ulang prosedur untuk menggunakan lebih sedikit array bersarang sebelum pengaturan nilai standar.
Kamil Kiełczewski
27

Dua lapisan:

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

Ini akan menghasilkan array a dengan panjang 10, diisi dengan array. (Push menambahkan elemen ke array dan mengembalikan panjang baru)

domenukk
sumber
13
Satu-liner: for (var a=[]; a.push([])<10;);?
Bergi
@Bergi akankah variabel masih ditentukan di baris berikutnya ..?
StinkyCat
1
@StinkyCat: Ya, begitulah cara varkerjanya. Selalu dibatasi fungsi.
Bergi
Saya tahu, oleh karena itu one-liner Anda tidak berguna dalam kasus ini: Anda tidak dapat "mengakses anggota" (pertanyaan cek)
StinkyCat
1
domenukk dan @Bergi, Anda berdua benar. Saya mencobanya dan saya dapat mengakses setelah untuk. Saya minta maaf! dan terima kasih, semoga ini menjadi pelajaran bagi saya;)
StinkyCat
24

Sepertinya jawaban paling jernih

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);


Catatan kita tidak bisa langsung mengisi dengan baris karena isi menggunakan konstruktor copy dangkal, oleh karena itu semua baris akan berbagi memori yang sama ... di sini adalah contoh yang menunjukkan bagaimana setiap baris akan dibagi (diambil dari jawaban lain):

// 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);
Francesco Dondi
sumber
Ini harus di bagian paling atas. Saya melakukan sesuatu yang serupa menggunakan Array.apply(null, Array(nrows))tetapi ini jauh lebih elegan.
dimiguel
Mengenai komentar terakhir saya ... Internet Explorer dan Opera tidak memiliki dukungan untuk fill. Ini tidak akan berfungsi pada sebagian besar browser.
dimiguel
@dimgl Isi dapat ditiru dalam contoh ini dengan peta konstan:, Array(nrows).map(() => 0)atau,Array(nrows).map(function(){ return 0; });
Conor O'Brien
20

Cara termudah:

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'
Chicharito
sumber
18

Inilah yang saya raih:

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

Ini mengeja saya bineeshkumar

Bineesh
sumber
2
Perhatikan bagaimana Anda hanya dapat mengakses indeks 0 dari array induk. Ini tidak berguna seperti sesuatu yang memungkinkan Anda untuk mengatur, misalnya, appVar [5] [9] = 10; ... Anda akan mendapatkan 'Tidak dapat menetapkan properti "9" dari yang tidak terdefinisi' dengan ini.
RaisinBranCrunch
Tetapi appVar[1][4] = "bineesh";apakah salah, bagaimana mengatasinya?
Gank
16

Array dua dimensi dibuat dengan cara yang sama dengan array satu dimensi. Dan Anda mengaksesnya seperti array[0][1].

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

alert (arr[2][1]); //alerts "4"
TJ L
sumber
14

Saya tidak yakin apakah ada yang menjawab ini tetapi saya menemukan ini bekerja dengan baik -

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

misalnya:

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

Untuk array 2 dimensi, misalnya.

Uchenna
sumber
Bagaimana saya bisa melakukan ini secara dinamis? Saya ingin array dalam dengan ukuran yang berbeda.
alap
3
Anda tidak perlu koma tambahan var array = [[],[]]sudah cukup.
Kaya Toast
13

Untuk membuat array 2D dalam javaScript kita bisa membuat Array terlebih dahulu dan kemudian menambahkan Array sebagai elemen-elemennya. Metode ini akan mengembalikan array 2D dengan jumlah baris dan kolom yang diberikan.

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

untuk membuat Array, gunakan metode ini seperti di bawah ini.

var array = Create2DArray(10,20);
utama
sumber
2
Tolong Anda menambahkan beberapa informasi penjelas ke laporan Anda yang menunjukkan cara kerjanya, dan mengapa itu memecahkan masalah. Ini akan membantu orang lain yang menemukan halaman ini di masa depan
Manusia Kita di Pisang
Kapan Anda membutuhkan Array yang diinisialisasi dengan sejumlah kolom di Javascript? Anda dapat mengakses elemen ke-n dari array [] juga.
domenukk
Saya perhatikan fungsi dimulai dengan huruf kapital C, yang (dengan konvensi tertentu) menyarankannya akan menjadi Function constructor dan Anda akan menggunakannya dengan kata kunci baru. Mungkin sangat kecil dan agak berpendapat, tapi saya masih menyarankan kata yang tidak dikapitalisasi.
Hachi
12

Untuk membuat array "2D" non-sparse (x, y) dengan semua indeks dialamatkan dan nilai disetel ke nol:

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

bonus "3D" Array (x, y, z)

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

Variasi dan koreksi tentang hal ini telah disebutkan dalam komentar dan di berbagai titik dalam menanggapi pertanyaan ini tetapi bukan sebagai jawaban yang sebenarnya, jadi saya menambahkannya di sini.

Perlu dicatat bahwa (mirip dengan sebagian besar jawaban lainnya) ini memiliki kompleksitas waktu O (x * y) sehingga mungkin tidak cocok untuk array yang sangat besar.

Justin Ohms
sumber
1
hati-hati karena fillmengatur nilai yang sama. jika berubah nullmenjadi `objek itu akan menjadi objek yang sama di setiap kolom
Stanislav Mayorov
@StanislavMayorov Jika Anda ingin menetapkan nilai masing-masing sel, gunakan saja trik yang sama:let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
haykam
10

Gunakan Array Comprehensions

Dalam JavaScript 1.7 dan lebih tinggi Anda dapat menggunakan pemahaman array untuk membuat array dua dimensi. Anda juga dapat memfilter dan / atau memanipulasi entri sambil mengisi array dan tidak harus menggunakan loop.

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"]
         ]
*/

Anda dapat membuat berbagai n x marray yang Anda inginkan dan mengisinya dengan nilai default dengan memanggil

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],
         ]
*/

Lebih banyak contoh dan dokumentasi dapat ditemukan di sini .

Harap dicatat bahwa ini belum merupakan fitur standar .

Tim Hallyburton
sumber
Periksa google cepat di sini ... ya ... forpernyataan itu masih loop ...
Pimp Trizkit
1
Itu tidak didukung oleh browser apa pun - DI SINI ?
Kamil Kiełczewski
10

Untuk pecinta satu liner, Array.from ()

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

Satu lagi (dari komentar oleh dmitry_romanov) menggunakan Array (). Fill ()

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

Menggunakan operator spread ES6 + ("terinspirasi" oleh jawaban InspiredJW :))

// same as above just a little shorter
const arr2d = [...Array(8)].map(() => Array(8).fill("0"))
saya-
sumber
2
kita dapat menghapus 0dalam fill()fungsi pertama :const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Jinsong Li
8

Pendekatan saya sangat mirip dengan jawaban @Bineesh tetapi dengan pendekatan yang lebih umum.

Anda dapat mendeklarasikan array ganda sebagai berikut:

var myDoubleArray = [[]];

Dan menyimpan dan mengakses konten dengan cara berikut:

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'],) 

Ini akan mencetak output yang diharapkan

[ 9, 8 ] 9 123
Alexander
sumber
8

Performa

Hari ini 2020.02.05 saya melakukan tes pada MacOs HighSierra 10.13.6 di Chrome v79.0, Safari v13.0.4 dan Firefox v72.0, untuk solusi yang dipilih.

Kesimpulan untuk array 2d yang tidak diinisialisasi

  • solusi esoteris {}/arr[[i,j]] (N) tercepat untuk array besar dan kecil dan sepertinya itu pilihan yang baik untuk array jarang besar
  • solusi berdasarkan for-[]/while (A, G) cepat dan mereka pilihan yang baik untuk array kecil.
  • solusi for-[] (B, C) cepat dan mereka pilihan yang baik untuk array besar
  • solusi berdasarkan Array..map/from/fill (I, J, K, L, M) cukup lambat untuk array kecil, dan cukup cepat untuk array besar
  • surprinsingly for-Array(n)(B, C) jauh lebih lambat pada safari daripada for-[](A)
  • surprinsingly for-[](A) untuk array besar lambat di semua browser
  • solusi K lambat untuk array kecil untuk semua browser
  • solusi A, E, G lambat untuk array besar untuk semua browser
  • solusi M paling lambat untuk semua array di semua browser

masukkan deskripsi gambar di sini

Kesimpulan untuk array 2d yang diinisialisasi

  • solusi berdasarkan for/while(A, B, C, D, E, G) tercepat / cukup cepat untuk array kecil di semua browser
  • solusi berdasarkan for(A, B, C, E) tercepat / cukup cepat untuk array besar di semua browser
  • solusi berdasarkan Array..map/from/fill (I, J, K, L, M) sedang cepat atau lambat untuk array kecil di semua browser
  • solusi F, G, H, I, J, K, L untuk array besar sedang atau cepat pada chrome dan safari tetapi paling lambat pada firefox.
  • solusi esoterik {}/arr[[i,j]](N) paling lambat untuk array kecil dan besar di semua browser

masukkan deskripsi gambar di sini

Detail

Tes untuk solusi yang tidak mengisi array (inisialisasi)

Kami menguji kecepatan solusi untuk

  • array kecil (12 elemen) - Anda dapat melakukan tes pada mesin Anda DI SINI
  • array besar (1 juta elemen) array - Anda dapat melakukan tes pada mesin Anda DI SINI

Tes untuk solusi yang mengisi (menginisialisasi) output array

Kami menguji kecepatan solusi untuk

  • array kecil (12 elemen) - Anda dapat melakukan tes pada mesin Anda DI SINI
  • array besar (1 juta elemen) array - Anda dapat melakukan tes pada mesin Anda DI SINI

masukkan deskripsi gambar di sini

Kamil Kiełczewski
sumber
7

Saya temukan di bawah ini adalah cara paling sederhana:

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

alert(array1[0][100]);
alert(array1.length);
alert(array1[0].length);
GMsoF
sumber
array1[1][100] = 666;melemparUncaught TypeError: Cannot set property '100' of undefined
Kamil Kiełczewski
@ KamilKiełczewski Anda benar, sepertinya ini hanya memulai untuk array array pertama, untuk yang kedua sebelum Anda melakukannya array1[1][100] = 666;, Anda perlu melakukan ini array1[1] = [];.
GMsoF
6

Javascript tidak mendukung array dua dimensi, sebaliknya kami menyimpan array di dalam array lain dan mengambil data dari array itu tergantung pada posisi array yang ingin Anda akses. Ingat penomoran array dimulai dari NOL .

Contoh Kode:

/* 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
Rick
sumber
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);

antelove
sumber
6

ES6 +, ES2015 + dapat melakukan ini dengan cara yang lebih sederhana


Membuat 3 x 2 Array diisi dengan true

[...Array(3)].map(item => Array(2).fill(true))
jwchang
sumber
Saya perlu mengaku. Saya "mengadopsi" jawaban Anda dan menambahkan kepada saya , koleksi one-liners.
my-
5

Saya harus membuat fungsi array yang fleksibel untuk menambahkan "catatan" ke dalamnya seperti yang saya butuhkan dan dapat memperbaruinya dan melakukan perhitungan apa pun yang diperlukan sebelum saya mengirimnya ke database untuk diproses lebih lanjut. Ini kodenya, semoga membantu :).

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"
}

Jangan ragu untuk mengoptimalkan dan / atau menunjukkan bug :)

CJ Mendes
sumber
Bagaimana dengan adil aLine.push([clmn1, clmn2, clmn3]);?
Pimp Trizkit
5

Inilah cara cepat yang saya temukan untuk membuat array dua dimensi.

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

Anda dapat dengan mudah mengubah fungsi ini menjadi fungsi ES5 juga.

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

Mengapa ini bekerja: new Array(n)konstruktor membuat objek dengan prototipe Array.prototypedan kemudian menetapkan objek length, menghasilkan array yang tidak berpenghuni. Karena kurangnya anggota yang sebenarnya, kami tidak dapat menjalankan Array.prototype.mapfungsinya.

Namun, ketika Anda memberikan lebih dari satu argumen kepada konstruktor, seperti ketika Anda melakukannya Array(1, 2, 3, 4), konstruktor akan menggunakan argumentsobjek untuk membuat instance dan mengisiArray objek dengan benar.

Untuk alasan ini, kita dapat menggunakan Array.apply(null, Array(x)), karena applyfungsi akan menyebarkan argumen ke konstruktor. Untuk klarifikasi, melakukan Array.apply(null, Array(3))sama dengan melakukan Array(null, null, null).

Sekarang kita telah membuat array berpopulasi aktual, yang perlu kita lakukan hanyalah memanggil mapdan membuat layer kedua ( y).

dimiguel
sumber
5

Di bawah ini, buat matriks 5x5 dan isi dengan null

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

console.log(md);

zeah
sumber
3
Jawaban ini salah. Ini akan membuat array dengan array yang sama mengisi slotnya. md[1][0] = 3 dan semua elemen lainnya diperbarui juga
Qiang
5

Ukuran baris dan kolom dari suatu array yang hanya diketahui pada saat run maka metode berikut dapat digunakan untuk membuat array 2d dinamis .

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
SridharKritha
sumber
4

Ada solusi lain, yang tidak memaksa Anda untuk menentukan sebelumnya ukuran array 2d, dan itu sangat ringkas.

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

Ini berfungsi karena, [1,2]ditransformasikan menjadi string, yang digunakan sebagai kunci string untuk tableobjek.

Oli
sumber
Jawaban ini saja membuat saya tidak ingin mengacaukan sampah yang merupakan array "multi-dimensi" dalam JavaScript, bahkan saya punya solusi yang sangat elegan. Ini juga menggambarkan bahwa semua orang sebenarnya tidak membuat array multidimensi sama sekali. Sama seperti sebuah "array" dalam JavaScript; jawaban ini akan benar-benar "mensimulasikan" array pseudo-tak terbatas, dimensi tak terbatas ukuran dan konten sewenang-wenang. Semua jawaban berbasis rekursi dan loop lainnya memiliki batas atas yang jauh lebih rendah dengan ukuran struktur array yang dapat mereka buat. Dan kreasi kecepatan akan menjadi masalah utama untuk struktur yang lebih besar ini.
Pimp Trizkit
Gunakan baris ini sebagai gantinya untuk mensimulasikan pengisian awal:var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Pimp Trizkit
Cara yang bagus dan kreatif untuk 'meniru' Array2D dengan objek :)
Kamil Kiełczewski
4

Untuk membuat array 4x6, cukup lakukan ini

const x = [...Array(6)].map(elem => new Array(4))
tamu
sumber