JavaScript'te nasıl iki boyutlu bir dizi oluşturabilirim?


1136

Çevrimiçi okuyordum ve bazı yerler bunun mümkün olmadığını söylüyor, bazıları bunun olduğunu söylüyor ve sonra bir örnek veriyor ve diğerleri örneği reddediyor, vb.

  1. JavaScript'te 2 boyutlu bir diziyi nasıl bildirebilirim? (mümkün olduğunu varsayarsak)

  2. Üyelerine nasıl erişebilirim? ( myArray[0][1]veya myArray[0,1]?)


21
Biraz bilgiç bir tanım varsayarsak, javascript'te 2d dizisi oluşturmak teknik olarak imkansızdır. Ancak, aynı anlama gelen bir dizi dizi oluşturabilirsiniz.
IJ Kennedy

10
Bilginize ... bir diziyi daha fazla diziyle kullanarak doldurduğunuzda var arr2D = new Array(5).fill(new Array(3));, Dizi (5) öğelerinin her biri aynı Diziye (3) işaret eder. Bu nedenle, alt dizileri dinamik olarak doldurmak için bir for döngüsü kullanmak en iyisidir.
Josh Stribling

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

2
Başka bir deyişle, fillçağırmaz new Array(3)böyle başlangıçta 0 ile 'dizisi doldurur yukarıda Longfei Wu'nun açıklama gibi bir lambda ifadesi falan, olmadığından, dolduruluyor dizinin her endeksi için, daha sonra bir lambda ile harita fonksiyonunu kullanır her öğeyi yeni bir dizi ile doldurun. Doldurma işlevi diziyi tam olarak söylediklerinizle doldurur. bu mantıklı mı? mapİşlev hakkında daha fazla bilgi için , bkz. Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Josh Stribling

2
@kalehmann bu iyi: 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

Yanıtlar:


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
Büyük bir çok boyutlu diziyi bu şekilde başlatmak zor olurdu. Bununla birlikte, bu işlev , boyutlar parametre olarak belirtilen boş bir çok boyutlu oluşturmak için kullanılabilir.
Anderson Green

2
@AndersonGreen Çok D dizi çözümü ile ilgilenenler için bir bağlantıdan bahsettiğiniz iyi bir şey, ancak soru ve Ballsacian1'in cevabı "multi-D" dizisi değil, "2D" dizisi hakkında
evilReiko 14:14

Her şeyi gözden geçirmelisiniz ... örneğin uyarı (öğeler [0] [1]); // 2 vb.
Dois

1
@SashikaXP, bu 0 dışındaki ilk endeksler için geçerli değildir
Michael Franzl

1
Soru, iki boyutlu bir dizinin nasıl bildirileceği. Aradığım ve bulduğum bu ve beyan ve başlatma arasındaki farkı fark etmeyen cevapları takip ediyorum. Bilinen uzunluğu veya sınırsız beyanı da vardır, ikisi de tartışılmaz.
chris

444

Dizideki her öğeyi bir dizi haline getirirsiniz.

var x = new Array(10);

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

console.log(x);


6
Anahtarları ve değerleri için dize gibi şeyler kullanabilirler mi? myArray ['Kitap'] ['item1']?
Diego

42
@Diego, evet, ancak dizilerin amacı bu değil. Anahtarlarınız dize olduğunda bir nesneyi kullanmak daha iyidir.
Matthew Crumley

10
Bu örneği kabul edilen yanıttan daha iyi seviyorum çünkü dinamik olarak boyutlandırılmış diziler için uygulanabilir, örneğin bir değişken new Array(size)nerede size.
Variadicism

1
çalışmıyor - ödev hatası. Bu cevap işe yaramazsa nasıl 280 beğeni aldı?
Gargo

1
Bu çalışıyor, teşekkürler. Gargo jsfiddle.net/matasoy/oetw73sj
matasoy 23:16

198

Activa'nın cevabına benzer şekilde, n-boyutlu bir dizi oluşturmak için bir fonksiyon:

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
Bu 4 boyutlu bir dizi oluşturabilir mi?
trusktr

4
@trusktr: Evet, istediğiniz kadar boyut oluşturabilirsiniz (bellek kısıtlamalarınız dahilinde). Sadece dört boyutun uzunluğunu geçirin. Örneğin var array = createArray(2, 3, 4, 5);,.
Matthew Crumley

4
En iyi cevap ! Ancak, 0 veya 1 parametreli (yararsız) kullanmanızı tavsiye etmem
Apolo

2
@BritishDeveloper Evet. Bu 5D dizi her uzunluğu 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 zaman kaybetmek için üzgünüm - alaycı oldu: /
İngilizDeveloper

84

Javascript'in yalnızca 1 boyutlu dizileri vardır, ancak diğerlerinin belirttiği gibi diziler dizileri oluşturabilirsiniz.

Aşağıdaki işlev 2 boyutlu sabit boyutlar dizisi oluşturmak için kullanılabilir:

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

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

  return arr;
}

Sütun sayısı gerçekten önemli değildir, çünkü bir diziyi kullanmadan önce boyutunu belirtmek gerekli değildir.

Ardından şunları arayabilirsiniz:

var arr = Create2DArray(100);

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

kart destesini temsil eden 2-dim dizi yapmak istiyorum. Bu, kart değerini tutan ve daha sonra takımda tutan 2-dim bir dizi olacaktır. Bunu yapmanın en kolay yolu ne olurdu.
Doug Hauf

1
işlev Create2DArray (satırlar) {var arr = []; for (var i = 0; i <satır; i ++) {arr [i] = []; } geri dönüş tarihi; } işlev print (deck) {for (t = 1; t <= 4; t ++) {for (i = 1; i <= 13; i ++) {document.writeln (deck [t] [i]); }}} fucntion fillDeck (d) {for (t = 1; t <= 4; t ++) {myCardDeck [t] [1] = t; for (i = 1; i <= 13; i ++) {myCardDeck [t] [i] = i; }}} loadCardDeck () işlevi {var myCardDeck = Create2DArray (13); fillDeck (myCardDeck); (myCardDeck) yazdırır; }
Doug Hauf

2
@Doug: Aslında 2 özniteliğe sahip tek boyutlu bir dizi nesne istiyorsunuz. var deck = []; deck [0] = {face: 1, takım elbise: 'H'};
TeasingDart

@ DooHauf bu küçültülmüş bir 2D dizi ?? : P: D
Mahi

78

En kolay yol:

var myArray = [[]];

29
bir 2 boyutlu dizi hangi
Maurizio, Danimarka

15
Evet, dikkatli ol. MyArray [0] [her ne olursa olsun] atamak iyidir, ancak myArray [1] [her neyse] 'i ayarlamayı deneyin ve myArray [1]' in tanımsız olduğundan şikayet eder.
Philip

22
@Philip myArray[1]=[];atamadan önce ayarlamanız gerekirmyArray[1][0]=5;
182764125216

4
Dikkat edin, bu mu değil @AndersonGreen yazdığı gibi "boş 1x1 dizi oluşturmak". Bir "1x0" dizisi oluşturur (yani, 0 sütunlu bir dizi içeren 1 satır). myArray.length == 1ve myArray[0].length == 0. Sonra içine "gerçekten boş" "0x0" dizisini kopyalarsanız yanlış sonuç verir.
JonBrave

3
Bu benim için günün bilgisiydi . Thanks :)
th3pirat3

76

Boş bir iki boyutlu dizi nasıl oluşturulur (tek satır)

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

2 ve 4 sırasıyla birinci ve ikinci boyutlardır.

Array.fromHer bir öğe için dizi benzeri bir param ve isteğe bağlı bir eşleme alabilen kullanıyoruz .

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

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

1 ... N içeren bir JavaScript dizisi oluşturmak için aynı hile kullanılabilir


Alternatif olarak (ancak % 12 daha fazla verimsizn = 10,000 )

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

Performans düşüşü, ilk boyut değerlerinin çalıştırılmak üzere başlatılması gerektiğidir .map. ArrayKonumları siz sipariş verene .fillveya doğrudan değer atamasına sipariş etmeden ayırmayacağınızı unutmayın .

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


Takip et

İşte doğru görünen ancak sorunları olan bir yöntem .

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

Görünüşte istenen iki boyutlu diziyi ( [ [ <4 empty items> ], [ <4 empty items> ] ]) döndürürken, bir catch: birinci boyutlu diziler referans olarak kopyalanmıştır. Bu, arr[0][0] = 'foo'a'nın aslında bir yerine iki satırı değiştireceği anlamına gelir .

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


Bunu öneririm:Array.from({length:5}, () => [])
vsync

Subjektif burada ama bu cevap (içindeki ilk ve ikinci) özlü, hızlı ve modernin en iyi dengesi gibi görünüyor.
Brady Dowling

@zurfyx herhangi bir fikir ya da webstorm'un bu konuda neden şikayetçi olduğunu bilen var mı? Bu dizi.from undefined olarak değerleri bırakarak tutar ve snippet burada stackoverflow iyi çalışıyor olsa bile oluşturulan dizi ile çalışamaz
FaultyJuggler

46

Bazılarının mümkün olmadığını söylemesinin nedeni, iki boyutlu bir dizinin gerçekten sadece diziler dizisidir. Buradaki diğer yorumlar, JavaScript'te iki boyutlu diziler oluşturmak için mükemmel geçerli yöntemler sağlar, ancak en saf bakış açısı, tek boyutlu bir nesne diziniz olması, bu nesnelerin her birinin iki öğeden oluşan tek boyutlu bir dizi olması olacaktır.

Yani, çelişen bakış açılarının nedeni budur.


41
Hayır değil. Bazı dillerde, çok boyutlu dizilere sahip olabilirsiniz string[3,5] = "foo";. Bazı senaryolar için daha iyi bir yaklaşımdır, çünkü Y ekseni aslında X ekseninin bir alt öğesi değildir.
Rafael Soares

3
Altta yatan makine koduna ulaştığında,> 1 boyutundaki tüm tansörler, hangi dilden bahsediyorsak, diziler dizisidir. Önbellek optimizasyonu nedeniyle bunu akılda tutmaya değer. Sayısal hesaplama için ciddiye hitap eden iyi bir dil, çok boyutlu yapınızı bellekte en çok kullanılan boyutunuzun bitişik olarak saklanacağı şekilde hizalamanıza izin verecektir. Python'dan Numpy, Fortran ve C akla geliyor. Gerçekten de, bu nedenle boyutluluğun birden fazla yapıya indirgenmesinin faydalı olduğu durumlar vardır.
Thomas Browne

Bilgisayarların boyut kavramı yoktur. Sadece 1 boyut var, hafıza adresi. Diğer her şey programcının yararına notasyonel bir dekorasyon.
TeasingDart

3
@ThomasBrowne Tam olarak değil. "Dizilerin dizileri", iç dizilerin boyutları (biraz farklı olabilir) için bir miktar depolama alanı ve bir iç dizinin depolandığı yeri bulmak için başka bir işaretçi kaydının kaldırılmasını gerektirir. Herhangi bir "iyi" dilde çok boyutlu diziler pürüzlü dizilerden farklıdır, çünkü bunlar kendi başına farklı veri yapılarıdır. (Ve kafa karıştırıcı kısmı, [a] [b] sözdizimi ile dizinlenmiş olsalar da, C dizilerinin çok boyutlu olmalarıdır.)
polkovnikov.ph 18:15

33

Birkaç kişi itme kullanımını gösterir:
Yeni bir şey getirmek için, matrisi bir değerle nasıl başlatacağınızı göstereceğim, örneğin: 0 veya boş bir dize "".
10 element dizisine sahipseniz, javascript'te son dizinin 9 olacağını hatırlatırız!

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

kullanım örnekleri:

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

Son for(varsayılan değeri ayarlayan) yordamınızdan kaldırıyorum ve yazıyorum m=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m));- ve çok strage matrisi (çok fazla iç içe geçmiş) alıyoruz - varsayılanValue adımı için son olarak onarıyorsunuz, ancak daha önce iç içe geçmiş arras kullanmak için yordamı yeniden yazabileceğinizi düşünüyorum varsayılan değerleri ayarlama.
Kamil Kiełczewski

27

İki astar:

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

Dizilerle doldurulmuş, uzunluğu 10 olan bir dizi üretecektir. (Push, bir diziye bir öğe ekler ve yeni uzunluğu döndürür)


13
Tek astarı: for (var a=[]; a.push([])<10;);?
Bergi

@Bergi değişkeni bir sonraki satırda tanımlanacak mı?
StinkyCat

1
@StinkyCat: Evet, işte böyle varçalışır. Her zaman fonksiyon kapsamlıdır.
Bergi

Biliyorum, bu nedenle tek astarınız bu durumda işe yaramaz: "üyelerine erişemezsiniz" (soruyu kontrol edin)
StinkyCat

1
domenukk ve @Bergi, ikiniz de haklısınız. Ben denedim ve ben sonra bir erişebilirsiniz. Özür dilerim! ve teşekkür ederim, bu bana bir ders olabilir;)
StinkyCat

24

En güzel cevap,

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


Dolgu sığ kopya oluşturucu kullandığından doğrudan satırlarla dolduramayacağımızı unutmayın , bu nedenle tüm satırlar aynı belleği paylaşır ... işte her satırın nasıl paylaşılacağını gösteren örnek (diğer yanıtlardan alınmıştır):

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

Bu en tepede olmalı. Ben de benzer bir şey yaptım Array.apply(null, Array(nrows))ama bu çok daha zarif.
dimiguel

Bu konudaki son yorumum ... Internet Explorer ve Opera'nın desteği yok fill. Bu, tarayıcıların çoğunda çalışmaz.
dimiguel

@dimgl Dolgu bu örnekte sabit bir harita ile taklit edilebilir:, Array(nrows).map(() => 0)veya,Array(nrows).map(function(){ return 0; });
Conor O'Brien

20

En kolay yol:

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

Ben ne elde etti:

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

Bu beni bineeshkumar olarak heceledi


2
Üst dizinin yalnızca 0 dizinine nasıl erişebileceğinize dikkat edin. Bu, örneğin, appVar [5] [9] = 10 ayarlamanıza izin veren bir şey kadar kullanışlı değildir; ... bununla "tanımsız" 9 "özelliği ayarlanamaz.
Kuru üzümBranCrunch

Ama appVar[1][4] = "bineesh";yanlış, nasıl çözülür?
18:50

16

İki boyutlu diziler, tek boyutlu diziler gibi oluşturulur. Ve onlara böyle erişiyorsun array[0][1].

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

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

14

Kimsenin bunu yanıtlayıp yanıtlamadığından emin değilim ama bunun benim için gayet iyi çalıştığını gördüm -

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

Örneğin:

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

Örneğin 2 boyutlu bir dizi için.


Bunu dinamik olarak nasıl yapabilirim? Farklı boyutlarda iç diziler istiyorum.
alap

3
Fazladan virgül gerekmez var array = [[],[]].
Kaya Toast

13

JavaScript'te bir 2D dizi oluşturmak için önce bir Dizi oluşturabilir ve ardından Dizileri öğe olarak ekleyebiliriz. Bu yöntem, verilen sayıda satır ve sütun içeren bir 2D dizi döndürür.

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

Array oluşturmak için bu yöntemi aşağıdaki gibi kullanın.

var array = Create2DArray(10,20);

2
Lütfen yanıtlayıcınıza nasıl çalıştığını ve sorunun neden çözüldüğünü gösteren bazı açıklayıcı bilgiler ekler misiniz? Bu, gelecekte bu sayfayı bulan diğerlerine yardımcı olacaktır
Adamımız

Ne zaman Javascript'te belirli sayıda sütunla önceden başlatılmış bir Diziye ihtiyacınız olur? Bir [] dizisinin n. Öğesine de erişebilirsiniz.
domenukk

İşlevin (belirli kurallara göre) bir İşlev yapıcı olacağını ve yeni anahtar kelimeyle kullanacağınızı öneren büyük C ile başladığını fark ettim. Çok küçük ve biraz düşünülmüş olabilir, ama yine de büyük harf olmayan bir kelime öneririm.
Hachi

12

Tüm dizinler adreslenebilir ve değerler null olarak ayarlanmış seyrek olmayan bir "2D" dizi (x, y) oluşturmak için:

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

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

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

Bu konuda varyasyonlar ve düzeltmeler yorumlarda ve bu soruya yanıt olarak çeşitli noktalarda belirtilmiştir, ancak gerçek bir cevap olarak değil, bu yüzden buraya ekliyorum.

(Diğer cevapların çoğuna benzer şekilde) bunun O (x * y) zaman karmaşıklığına sahip olduğuna dikkat edilmelidir, bu nedenle muhtemelen çok büyük diziler için uygun değildir.


1
dikkatli olun çünkü fillaynı değeri ayarlayın. null`` nesne olarak değiştirilirse her sütunda aynı nesne olacaktır
Stanislav Mayorov

@StanislavMayorov Her bir hücrenin değerini ayarlamak istiyorsanız, aynı hileyi kullanın:let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
haykam

10

Dizi Anlamalarını Kullan

JavaScript 1.7 ve sonraki sürümlerinde, iki boyutlu diziler oluşturmak için dizi kavrayışlarını kullanabilirsiniz . Diziyi doldururken girdileri filtreleyebilir ve / veya değiştirebilirsiniz ve döngüler kullanmak zorunda kalmazsınız.

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

İstediğiniz n x mdiziyi oluşturabilir ve arayarak varsayılan bir değerle doldurabilirsiniz.

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

Daha fazla örnek ve dokümantasyon burada bulunabilir .

Bunun henüz standart bir özellik olmadığını lütfen unutmayın .


Hızlı bir google check here ... evet ... forifade hala bir döngü ...
Pimp Trizkit

1
Herhangi bir tarayıcı tarafından desteklenmiyor - HERE ?
Kamil Kiełczewski

10

Bir astar severler için Array.from ()

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

Başka bir (dmitry_romanov tarafından yapılan yorumdan) Array () kullanın . Fill ()

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

ES6 + kullanma yayılmış operatörü (InspiredJW tarafından "ilham" cevap :))

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

2
0İlk fill()işlevde kaldırabiliriz :const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Jinsong Li

8

Yaklaşımım @Bineesh cevabına çok benziyor ama daha genel bir yaklaşımla.

Çift diziyi aşağıdaki gibi bildirebilirsiniz:

var myDoubleArray = [[]];

Ve içeriklerin aşağıdaki şekilde depolanması ve erişilmesi:

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

Bu beklenen çıktıyı yazdıracaktır

[ 9, 8 ] 9 123

7

Aşağıda bulduğum en basit yol:

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

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

array1[1][100] = 666;atarUncaught TypeError: Cannot set property '100' of undefined
Kamil Kiełczewski

@ KamilKiełczewski haklısınız, bu sadece dizinin ilk dizisi için başlatılmış gibi görünüyor array1[1][100] = 666;, bunu yapmadan önce ikincisi için bunu yapmanız gerekiyor array1[1] = [];.
GMsoF

7

Verim

Bugün 2020.02.05 Seçilen çözümler için Chrome v79.0, Safari v13.0.4 ve Firefox v72.0 üzerinde MacOs HighSierra 10.13.6 üzerinde testler yapıyorum.

Başlatılmamış 2d dizisi için sonuçlar

  • ezoterik çözüm {}/arr[[i,j]](N) büyük ve küçük diziler için en hızlıdır ve büyük seyrek diziler için iyi bir seçim gibi görünüyor
  • for-[]/while(A, G) tabanlı çözümler hızlıdır ve küçük diziler için iyi bir seçimdir.
  • çözümler for-[](B, C) hızlıdır ve büyük diziler için iyi bir seçimdir
  • Array..map/from/fill(I, J, K, L, M) tabanlı çözümler küçük diziler için oldukça yavaş ve büyük diziler için oldukça hızlıdır
  • surprinsingly for-Array(n)(B, C) safaride for-[](A) ' dan çok daha yavaştır
  • for-[]büyük dizi için surprinsingly (A) tüm tarayıcılarda yavaş
  • çözümleri K, tüm tarayıcılar için küçük diziler için yavaştır
  • A, E, G çözümleri tüm tarayıcılar için büyük diziler için yavaştır
  • M çözümü, tüm tarayıcılardaki tüm diziler için en yavaş çözümdür

resim açıklamasını buraya girin

Başlatılmış 2d dizisi için sonuçlar

  • for/while(A, B, C, D, E, G) tabanlı çözümler tüm tarayıcılardaki küçük diziler için en hızlı / oldukça hızlıdır
  • for(A, B, C, E) tabanlı çözümler tüm tarayıcılarda büyük diziler için en hızlı / oldukça hızlıdır
  • Array..map/from/fill(I, J, K, L, M) tabanlı çözümler tüm tarayıcılardaki küçük diziler için orta hızlı veya yavaştır
  • büyük diziler için çözümler F, G, H, I, J, K, L krom ve safari üzerinde orta veya hızlı, ancak firefox'ta en yavaştır.
  • ezoterik çözüm {}/arr[[i,j]](N) tüm tarayıcılarda küçük ve büyük diziler için en yavaş çözümdür

resim açıklamasını buraya girin

ayrıntılar

Çıkış dizisini doldurmayan (başlatan) çözümleri test edin

İçin çözümlerin hızını test ediyoruz

  • küçük diziler (12 eleman) - BURADA makinenizde testler yapabilirsiniz
  • büyük diziler (1 milyon eleman) diziler - BURADA makinenizde testler yapabilirsiniz

Çıkış dizisini dolduran (başlatan) çözümleri test edin

İçin çözümlerin hızını test ediyoruz

  • küçük diziler (12 eleman) - BURADA makinenizde testler yapabilirsiniz
  • büyük diziler (1 milyon eleman) diziler - BURADA makinenizde testler yapabilirsiniz

resim açıklamasını buraya girin


6

Javascript iki boyutlu dizileri desteklemez, bunun yerine bir diziyi başka bir dizinin içine kaydeder ve dizinin hangi konumuna erişmek istediğinize bağlı olarak verileri bu diziden alırız. En dizi numaralama başlar hatırla ZERO .

Kod Örneği:

/* 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 + bunu daha basit bir şekilde yapabilir


True ile dolu 3 x 2 Dizi oluşturma

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

İtiraf etmeliyim. Cevabınızı "benimsedim" ve tek gömlekli koleksiyon benimkini ekledim .
benim-

5

Ben i gerektiği gibi "kayıtları" eklemek için esnek bir dizi işlevi yapmak ve onları güncellemek ve daha fazla işlem için bir veritabanına göndermeden önce gerekli ne hesaplamalar e yapabilmek zorunda kaldı. İşte kod, umarım yardımcı olur :).

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

Herhangi bir hatayı optimize etmek ve / veya belirtmek için çekinmeyin :)


Sadece nasıl aLine.push([clmn1, clmn2, clmn3]);?
Pezevenk Trizkit

5

İşte iki boyutlu bir dizi yapmak için bulduğum hızlı bir yol.

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

Bu işlevi kolayca bir ES5 işlevine de dönüştürebilirsiniz.

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

Neden işe yarıyor: Kurucu, new Array(n)prototipine sahip bir nesne oluşturur Array.prototypeve sonra nesnenin nesnelerini atar ve lengthbu da doldurulmamış bir diziye neden olur. Gerçek üye olmayışı nedeniyle bu Array.prototype.mapişlevi yerine getiremiyoruz.

Böyle yapmanız olduğu gibi yapıcı, birden fazla argüman sağlamak Ancak, Array(1, 2, 3, 4), yapıcı kullanacak argumentsörneğini ve doldurmak An nesneArray doğru nesneyi.

Bu nedenle kullanabiliriz Array.apply(null, Array(x)), çünkü applyişlev argümanları yapıcıya yayar. Açıklamak Array.apply(null, Array(3))için yapmak yapmaya eşdeğerdir Array(null, null, null).

Artık gerçek bir nüfus dizisi oluşturduğumuza göre, tek yapmamız gereken mapikinci katmanı ( y) çağırmak ve oluşturmak .


5

Birinin altında, 5x5'lik bir matris oluşturur ve bunları null

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

console.log(md);


3
Bu cevap yanlış. Aynı diziyi yuvalarına dolduran bir dizi oluşturur. md[1][0] = 3 ve tüm diğer öğeler de güncellendi
Qiang

5

Yalnızca çalışma zamanında bilinen bir dizinin satır ve sütun boyutları, dinamik bir 2d dizisi oluşturmak için aşağıdaki yöntem kullanılabilir .

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

Sizi 2d dizisinin boyutunu önceden tanımlamaya zorlamayan ve çok özlü olan başka bir çözüm var.

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

Bu, çünkü [1,2]bir dize dönüştürülür, bu nesne için dize anahtarı olarak kullanılır çünkü çalışır table.


Bu cevap tek başına, çok şık bir çözümüm olsa bile, JavaScript'teki "çok boyutlu" diziler olan önemsiz ile uğraşmak istemediğimi gösteriyor.Bu da herkesin aslında çok boyutlu diziler yapmadığını gösteriyor. JavaScript'te bir "dizi"; bu cevap, rasgele boyutların ve içeriklerin sahte-sonsuz boyutlu, sonsuz boyutlu bir dizisini tamamen "simüle edecektir". Diğer tüm özyineleme ve döngü tabanlı cevaplar, oluşturabilecekleri dizi yapısının boyutu için çok daha düşük bir üst sınıra sahiptir. hız bu daha büyük yapılar için önemli bir konu olacaktır.
Pezevenk Trizkit

Ön dolguyu simüle etmek için bu satırı kullanın:var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Pimp Trizkit

Array2D'yi nesneye 'öykünmenin' güzel, yaratıcı yolu :)
Kamil Kiełczewski

4

4x6 dizi oluşturmak için bunu yapmanız yeterlidir

const x = [...Array(6)].map(elem => new Array(4))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.