Saya telah membaca online dan beberapa tempat mengatakan itu tidak mungkin, beberapa mengatakan itu dan kemudian memberikan contoh dan yang lain menyangkal contohnya, dll.
Bagaimana cara mendeklarasikan array 2 dimensi dalam JavaScript? (dengan asumsi itu mungkin)
Bagaimana saya mengakses anggotanya? (
myArray[0][1]
ataumyArray[0,1]
?)
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.a = Array(5).fill(0).map(x => Array(10).fill(0))
fill
jangan memanggilnew 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 tentangmap
fungsi ini, lihat: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…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.
Jawaban:
sumber
Anda cukup membuat setiap item dalam array menjadi array.
sumber
new Array(size)
manasize
variabel.Mirip dengan jawaban activa, berikut adalah fungsi untuk membuat array n-dimensi:
sumber
var array = createArray(2, 3, 4, 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]]]]]
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:
Jumlah kolom tidak terlalu penting, karena tidak diperlukan untuk menentukan ukuran array sebelum menggunakannya.
Maka Anda bisa langsung menelepon:
sumber
Cara termudah:
sumber
myArray[1]=[];
sebelum menetapkanmyArray[1][0]=5;
myArray.length == 1
danmyArray[0].length == 0
. Yang kemudian memberikan hasil yang salah jika Anda kemudian menyalin array "benar-benar kosong" "0x0" ke dalamnya.Cara membuat array dua dimensi kosong (satu baris)
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.Trik yang sama dapat digunakan untuk Membuat array JavaScript yang berisi 1 ... N
Atau (tetapi lebih tidak efisien 12% dengan
n = 10,000
)Penurunan kinerja datang dengan fakta bahwa kita harus memiliki nilai dimensi pertama yang diinisialisasi untuk dijalankan
.map
. Ingatlah bahwaArray
tidak akan mengalokasikan posisi sampai Anda memesannya melalui.fill
atau menentukan nilai langsung.Mengikuti
Berikut adalah metode yang tampak benar, tetapi memiliki masalah .
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 berartiarr[0][0] = 'foo'
benar-benar akan mengubah dua baris, bukan satu.sumber
Array.from({length:5}, () => [])
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.
sumber
string[3,5] = "foo";
. Ini pendekatan yang lebih baik untuk beberapa skenario, karena sumbu Y sebenarnya bukan anak dari sumbu X.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!
contoh penggunaan:
sumber
for
(yang menetapkan nilai default) dari prosedur Anda dan menulism=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.Dua lapisan:
Ini akan menghasilkan array a dengan panjang 10, diisi dengan array. (Push menambahkan elemen ke array dan mengembalikan panjang baru)
sumber
for (var a=[]; a.push([])<10;);
?var
kerjanya. Selalu dibatasi fungsi.Sepertinya jawaban paling jernih
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):
sumber
Array.apply(null, Array(nrows))
tetapi ini jauh lebih elegan.fill
. Ini tidak akan berfungsi pada sebagian besar browser.Array(nrows).map(() => 0)
atau,Array(nrows).map(function(){ return 0; });
Cara termudah:
sumber
Inilah yang saya raih:
Ini mengeja saya bineeshkumar
sumber
appVar[1][4] = "bineesh";
apakah salah, bagaimana mengatasinya?Array dua dimensi dibuat dengan cara yang sama dengan array satu dimensi. Dan Anda mengaksesnya seperti
array[0][1]
.sumber
Saya tidak yakin apakah ada yang menjawab ini tetapi saya menemukan ini bekerja dengan baik -
misalnya:
Untuk array 2 dimensi, misalnya.
sumber
var array = [[],[]]
sudah cukup.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.
untuk membuat Array, gunakan metode ini seperti di bawah ini.
sumber
Untuk membuat array "2D" non-sparse (x, y) dengan semua indeks dialamatkan dan nilai disetel ke nol:
bonus "3D" Array (x, y, z)
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.
sumber
fill
mengatur nilai yang sama. jika berubahnull
menjadi `objek itu akan menjadi objek yang sama di setiap kolomlet 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
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.
Anda dapat membuat berbagai
n x m
array yang Anda inginkan dan mengisinya dengan nilai default dengan memanggilLebih banyak contoh dan dokumentasi dapat ditemukan di sini .
Harap dicatat bahwa ini belum merupakan fitur standar .
sumber
for
pernyataan itu masih loop ...Untuk pecinta satu liner, Array.from ()
Satu lagi (dari komentar oleh dmitry_romanov) menggunakan Array (). Fill ()
Menggunakan operator spread ES6 + ("terinspirasi" oleh jawaban InspiredJW :))
sumber
0
dalamfill()
fungsi pertama :const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Pendekatan saya sangat mirip dengan jawaban @Bineesh tetapi dengan pendekatan yang lebih umum.
Anda dapat mendeklarasikan array ganda sebagai berikut:
Dan menyimpan dan mengakses konten dengan cara berikut:
Ini akan mencetak output yang diharapkan
sumber
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
{}/arr[[i,j]]
(N) tercepat untuk array besar dan kecil dan sepertinya itu pilihan yang baik untuk array jarang besarfor-[]/while
(A, G) cepat dan mereka pilihan yang baik untuk array kecil.for-[]
(B, C) cepat dan mereka pilihan yang baik untuk array besarArray..map/from/fill
(I, J, K, L, M) cukup lambat untuk array kecil, dan cukup cepat untuk array besarfor-Array(n)
(B, C) jauh lebih lambat pada safari daripadafor-[]
(A)for-[]
(A) untuk array besar lambat di semua browserKesimpulan untuk array 2d yang diinisialisasi
for/while
(A, B, C, D, E, G) tercepat / cukup cepat untuk array kecil di semua browserfor
(A, B, C, E) tercepat / cukup cepat untuk array besar di semua browserArray..map/from/fill
(I, J, K, L, M) sedang cepat atau lambat untuk array kecil di semua browser{}/arr[[i,j]]
(N) paling lambat untuk array kecil dan besar di semua browserDetail
Tes untuk solusi yang tidak mengisi array (inisialisasi)
Kami menguji kecepatan solusi untuk
Tampilkan cuplikan kode
Tes untuk solusi yang mengisi (menginisialisasi) output array
Kami menguji kecepatan solusi untuk
Tampilkan cuplikan kode
sumber
Saya temukan di bawah ini adalah cara paling sederhana:
sumber
array1[1][100] = 666;
melemparUncaught TypeError: Cannot set property '100' of undefined
array1[1][100] = 666;
, Anda perlu melakukan iniarray1[1] = [];
.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:
sumber
sumber
ES6 +, ES2015 + dapat melakukan ini dengan cara yang lebih sederhana
Membuat 3 x 2 Array diisi dengan true
sumber
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 :).
Jangan ragu untuk mengoptimalkan dan / atau menunjukkan bug :)
sumber
aLine.push([clmn1, clmn2, clmn3]);
?Inilah cara cepat yang saya temukan untuk membuat array dua dimensi.
Anda dapat dengan mudah mengubah fungsi ini menjadi fungsi ES5 juga.
Mengapa ini bekerja:
new Array(n)
konstruktor membuat objek dengan prototipeArray.prototype
dan kemudian menetapkan objeklength
, menghasilkan array yang tidak berpenghuni. Karena kurangnya anggota yang sebenarnya, kami tidak dapat menjalankanArray.prototype.map
fungsinya.Namun, ketika Anda memberikan lebih dari satu argumen kepada konstruktor, seperti ketika Anda melakukannya
Array(1, 2, 3, 4)
, konstruktor akan menggunakanarguments
objek untuk membuat instance dan mengisiArray
objek dengan benar.Untuk alasan ini, kita dapat menggunakan
Array.apply(null, Array(x))
, karenaapply
fungsi akan menyebarkan argumen ke konstruktor. Untuk klarifikasi, melakukanArray.apply(null, Array(3))
sama dengan melakukanArray(null, null, null)
.Sekarang kita telah membuat array berpopulasi aktual, yang perlu kita lakukan hanyalah memanggil
map
dan membuat layer kedua (y
).sumber
Di bawah ini, buat matriks 5x5 dan isi dengan
null
sumber
md[1][0] = 3
dan semua elemen lainnya diperbarui jugaUkuran baris dan kolom dari suatu array yang hanya diketahui pada saat run maka metode berikut dapat digunakan untuk membuat array 2d dinamis .
sumber
Ada solusi lain, yang tidak memaksa Anda untuk menentukan sebelumnya ukuran array 2d, dan itu sangat ringkas.
Ini berfungsi karena,
[1,2]
ditransformasikan menjadi string, yang digunakan sebagai kunci string untuktable
objek.sumber
var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Untuk membuat array 4x6, cukup lakukan ini
sumber