Làm cách nào để tạo một mảng hai chiều trong JavaScript?


1136

Tôi đã đọc trực tuyến và một số nơi nói rằng điều đó là không thể, một số người nói điều đó và sau đó đưa ra một ví dụ và những người khác bác bỏ ví dụ, v.v.

  1. Làm cách nào để khai báo mảng 2 chiều trong JavaScript? (giả sử là có thể)

  2. Làm thế nào tôi có thể truy cập các thành viên của nó? ( myArray[0][1]hoặc myArray[0,1]?)


21
Giả sử một định nghĩa hơi mô phạm, về mặt kỹ thuật không thể tạo ra một mảng 2d trong javascript. Nhưng bạn có thể tạo ra một mảng các mảng, tương đương với cùng một mảng.
IJ Kennedy

10
FYI ... khi bạn điền vào một mảng với nhiều mảng hơn bằng cách sử dụng var arr2D = new Array(5).fill(new Array(3));, mỗi phần tử của Mảng (5) sẽ trỏ đến cùng một Mảng (3). Vì vậy, tốt nhất là sử dụng vòng lặp for để tự động điền vào các mảng con.
Josh Stribling

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

2
Nói cách khác, fillkhông gọi new Array(3)cho mỗi chỉ số của mảng được điền, vì đó không phải là biểu thức lambda hay bất cứ điều gì, chẳng hạn như nhận xét của Longfei Wu ở trên, ban đầu điền vào mảng bằng 0, sau đó sử dụng hàm ánh xạ với lambda để điền vào mỗi phần tử với một mảng mới. Hàm fill chỉ đơn giản là điền vào mảng với chính xác những gì bạn nói với nó. Điều đó có ý nghĩa? Để biết thêm thông tin về mapchức năng, hãy xem: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
mẹo

2
@kalehmann vẫn ổn: 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

Câu trả lời:


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
Theo cách này, sẽ rất khó để khởi tạo một mảng nhiều chiều lớn. Tuy nhiên, chức năng này có thể được sử dụng để tạo đa chiều trống, với các kích thước được chỉ định làm tham số.
Anderson Green

2
@AndersonGreen Thật là một điều tốt khi bạn đề cập đến một liên kết cho những người quan tâm đến giải pháp mảng nhiều D, nhưng câu hỏi và câu trả lời của Ballsacian1 là về mảng "2D", chứ không phải mảng "multi-D"
evilReiko

Bạn nên xem toàn bộ ... ví dụ: cảnh báo (các mục [0] [1]); // 2, v.v.
Dois

1
@SashikaXP, điều này không hoạt động đối với các chỉ số đầu tiên khác 0.
Michael Franzl

1
Câu hỏi là làm thế nào để khai báo một mảng hai chiều. Đó là những gì tôi đang tìm kiếm và tìm thấy câu trả lời này và sau đó không nhận ra sự khác biệt giữa khai báo và khởi tạo. Ngoài ra còn có tuyên bố với chiều dài đã biết hoặc không giới hạn, cả hai đều không được thảo luận.
chris

444

Bạn chỉ cần làm cho mỗi mục trong mảng là một mảng.

var x = new Array(10);

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

console.log(x);


6
Họ có thể sử dụng những thứ như chuỗi cho khóa và giá trị của họ không? myArray ['Sách'] ['item1']?
Diego

42
@Diego, vâng, nhưng đó không phải là mục đích của mảng. Tốt hơn là sử dụng một đối tượng khi các khóa của bạn là chuỗi.
Matthew Crumley

10
Tôi thích ví dụ này tốt hơn câu trả lời được chấp nhận bởi vì điều này có thể được thực hiện cho các mảng có kích thước động, ví dụ như new Array(size)đâu sizelà một biến.
Chủ nghĩa biến thể

1
không hoạt động - lỗi khi chuyển nhượng. Làm thế nào có câu trả lời này có 280 lượt thích nếu nó vô dụng?
Gargo

1
Đây là làm việc, cảm ơn. Bạn có thể xem ví dụ Gargo jsfiddle.net/matasoy/oetw73sj
matasoy

198

Tương tự như câu trả lời của activa, đây là một hàm để tạo một mảng n chiều:

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
Điều này có thể tạo ra một mảng 4 chiều?
trusktr

4
@trusktr: Có, bạn có thể tạo nhiều kích thước như bạn muốn (trong giới hạn bộ nhớ của bạn). Chỉ cần vượt qua trong chiều dài của bốn chiều. Ví dụ , var array = createArray(2, 3, 4, 5);.
Matthew Crumley

4
Câu trả lời tốt nhất ! Tuy nhiên, tôi không khuyến nghị sử dụng nó với 0 hoặc 1 tham số (vô dụng)
Apolo

2
@BritishDeveloper Có. Đây là một mảng 5D với mỗi chiều dài ở 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 xin lỗi vì đã lãng phí thời gian của bạn - Tôi đã bị mỉa mai: /
Anh

84

Javascript chỉ có mảng 1 chiều, nhưng bạn có thể xây dựng mảng mảng, như những người khác đã chỉ ra.

Hàm sau có thể được sử dụng để xây dựng một mảng 2 chiều có kích thước cố định:

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

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

  return arr;
}

Số lượng cột không thực sự quan trọng, vì không bắt buộc phải chỉ định kích thước của một mảng trước khi sử dụng nó.

Sau đó, bạn có thể chỉ cần gọi:

var arr = Create2DArray(100);

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

tôi muốn tạo ra một mảng 2 mờ đại diện cho một cỗ bài. Đó sẽ là một mảng 2 mờ chứa giá trị thẻ và sau đó là phù hợp. Điều gì sẽ là cách dễ nhất để làm điều đó.
Doug Hauf

1
chức năng Create2DArray (hàng) {var Array = []; for (var i = 0; i <rows; i ++) {Array [i] = []; } mảng trả về; } chức năng in (boong) {for (t = 1; t <= 4; t ++) {for (i = 1; i <= 13; i ++) {document.writeln (boong [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; }}} Hàm loadCardDeck () {var myCardDeck = Create2DArray (13); fillDeck (myCardDeck); in (myCardDeck); }
Doug Hauf

2
@Doug: Bạn thực sự muốn một mảng các đối tượng một chiều với 2 thuộc tính. sàn var = []; boong [0] = {mặt: 1, bộ đồ: 'H'};
Trêu chọc

@DougHauf đó là một mảng 2D được rút gọn ?? : P: D
Mahi

78

Cách dễ nhất:

var myArray = [[]];

29
đó là mảng 2 chiều
Maurizio In denmark

15
Vâng, cẩn thận với điều đó. Chỉ định myArray [0] [sao cũng được, nhưng hãy thử và đặt myArray [1] [sao] và nó phàn nàn rằng myArray [1] không được xác định.
Philip

22
@Philip bạn phải đặt myArray[1]=[];trước khi gánmyArray[1][0]=5;
182764125216

4
Xin lưu ý, điều này không "tạo ra một mảng 1x1 trống" như @AndersonGreen đã viết. Nó tạo ra một mảng "1x0" (tức là 1 hàng chứa một mảng có 0 cột). myArray.length == 1myArray[0].length == 0. Sau đó, kết quả sẽ sai nếu bạn sao chép một mảng "0x0" thực sự trống rỗng vào đó.
JonBrave

3
@ 182764125216 đó là kiến thức trong ngày đối với tôi. Cảm ơn :)
th3pirat3

76

Cách tạo một mảng hai chiều trống (một dòng)

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

2 và 4 lần lượt là kích thước thứ nhất và thứ hai.

Chúng tôi đang sử dụng Array.from, có thể lấy tham số giống như mảng và ánh xạ tùy chọn cho từng thành phần.

Array.from (mảngLike [, mapFn [, thisArg]])

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

Thủ thuật tương tự có thể được sử dụng để Tạo một mảng JavaScript chứa 1 ... N


Cách khác (nhưng không hiệu quả hơn 12% với n = 10,000)

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

Việc giảm hiệu suất đi kèm với thực tế là chúng ta phải có các giá trị thứ nguyên đầu tiên được khởi tạo để chạy .map. Hãy nhớ rằng Arraysẽ không phân bổ các vị trí cho đến khi bạn đặt nó qua .fillhoặc gán giá trị trực tiếp.

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


Theo sát

Đây là một phương pháp có vẻ đúng, nhưng có vấn đề .

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

Mặc dù nó trả về mảng hai chiều rõ ràng mong muốn ( [ [ <4 empty items> ], [ <4 empty items> ] ]), nhưng có một nhược điểm: mảng thứ nguyên đầu tiên đã được sao chép bằng tham chiếu. Điều đó có nghĩa là arr[0][0] = 'foo'thực sự sẽ thay đổi hai hàng thay vì một.

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


Tôi đề nghị điều này:Array.from({length:5}, () => [])
vsync

Chủ quan ở đây nhưng câu trả lời này (thứ nhất và thứ hai trong đó) có vẻ như là sự cân bằng tốt nhất của cô đọng, nhanh chóng và hiện đại.
Brady Dowling

@zurfyx có ý kiến ​​gì không, hoặc có ai biết không, tại sao webstorm lại phàn nàn về điều này? Có vẻ như Array.from tiếp tục để lại các giá trị là không xác định và sau đó tôi không thể làm việc với mảng được tạo, mặc dù đoạn mã chạy tốt ở đây trên stackoverflow
FaultyJuggler

46

Lý do một số người nói rằng điều đó là không thể bởi vì một mảng hai chiều thực sự chỉ là một mảng của các mảng. Các ý kiến ​​khác ở đây cung cấp các phương pháp hoàn toàn hợp lệ để tạo các mảng hai chiều trong JavaScript, nhưng quan điểm thuần túy nhất là bạn có một mảng các đối tượng, mỗi đối tượng sẽ là một mảng một chiều gồm hai phần tử.

Vì vậy, đó là nguyên nhân của các quan điểm mâu thuẫn.


41
Không, không phải vậy. Trong một số ngôn ngữ, bạn có thể có các mảng đa chiều như thế nào string[3,5] = "foo";. Đó là một cách tiếp cận tốt hơn cho một số tình huống, bởi vì trục Y không thực sự là con của trục X.
Rafael Soares

3
Khi đã nhận được mã máy bên dưới, tất cả các thang đo kích thước> 1 là các mảng của mảng, bất kỳ ngôn ngữ nào chúng ta đang nói đến. Điều đáng ghi nhớ là vì lý do tối ưu hóa bộ đệm. Bất kỳ ngôn ngữ tử tế nào phục vụ nghiêm túc cho tính toán số sẽ cho phép bạn căn chỉnh cấu trúc đa chiều của mình trong bộ nhớ sao cho kích thước được sử dụng nhiều nhất của bạn được lưu trữ liên tục. Numpy, Fortran và C của Python, xuất hiện trong tâm trí. Thật vậy, có những trường hợp đáng để giảm kích thước thành nhiều cấu trúc vì lý do này.
Thomas Browne

Máy tính không có khái niệm về kích thước. Chỉ có 1 chiều, địa chỉ bộ nhớ. Mọi thứ khác là trang trí công chứng vì lợi ích của lập trình viên.
Trêu chọc

3
@ThomasBrowne Không chính xác. "Mảng của mảng" yêu cầu một số lưu trữ cho kích thước của mảng bên trong (chúng có thể khác nhau) và một hội nghị con trỏ khác để tìm nơi lưu trữ một mảng bên trong. Trong bất kỳ mảng đa ngôn ngữ "đàng hoàng" nào khác với các mảng lởm chởm, bởi vì chúng là các cấu trúc dữ liệu khác nhau. (Và điều khó hiểu là các mảng C là đa chiều, mặc dù chúng được lập chỉ mục với cú pháp [a] [b].)
polkovnikov.ph

33

Rất ít người chỉ ra cách sử dụng đẩy:
Để mang đến một cái gì đó mới, tôi sẽ chỉ cho bạn cách khởi tạo ma trận với một số giá trị, ví dụ: 0 hoặc một chuỗi rỗng "".
Nhắc nhở rằng nếu bạn có mảng 10 phần tử, trong javascript, chỉ mục cuối cùng sẽ là 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;
}

ví dụ sử dụng:

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

Tôi xóa cái cuối cùng for(đặt giá trị mặc định) khỏi thủ tục của bạn và viết m=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m));- và chúng tôi nhận được ma trận rất mạnh (quá nhiều lồng nhau) - bạn sửa chữa nó trong bước for-defaultValue cuối cùng, nhưng tôi nghĩ bạn có thể viết lại thủ tục để sử dụng các arras ít lồng nhau hơn trước thiết lập các giá trị mặc định.
Kamil Kiełczewski

27

Hai lớp lót:

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

Nó sẽ tạo ra một mảng a có độ dài 10, chứa đầy các mảng. (Đẩy thêm một phần tử vào một mảng và trả về độ dài mới)


13
Một lớp lót : for (var a=[]; a.push([])<10;);?
Bergi

@Bergi một biến vẫn sẽ được xác định trong dòng tiếp theo ..?
StinkyCat

1
@StinkyCat: Vâng, đó là cách varhoạt động. Nó luôn luôn có phạm vi chức năng.
Bergi

Tôi biết, do đó, một lớp lót của bạn là vô dụng trong trường hợp này: bạn không thể "truy cập các thành viên của nó" (kiểm tra câu hỏi)
StinkyCat

1
domenukk và @Bergi, cả hai bạn đều đúng. Tôi đã thử nó và tôi có thể truy cập vào sau. Tôi xin lỗi! và cảm ơn bạn, đây có thể là một bài học cho tôi;)
StinkyCat

24

Câu trả lời rõ ràng nhất là

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


Lưu ý rằng chúng ta không thể điền trực tiếp vào các hàng vì điền sử dụng hàm tạo sao chép nông, do đó tất cả các hàng sẽ chia sẻ cùng một bộ nhớ ... đây là ví dụ minh họa cách mỗi hàng sẽ được chia sẻ (lấy từ các câu trả lời khác):

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

Điều này nên ở trên cùng. Tôi đã làm một cái gì đó tương tự bằng cách sử dụng Array.apply(null, Array(nrows))nhưng điều này là thanh lịch hơn nhiều.
dimiguel

Về nhận xét cuối cùng của tôi ... Internet Explorer và Opera không hỗ trợ fill. Điều này sẽ không hoạt động trên phần lớn các trình duyệt.
dimiguel

@dimgl Fill có thể được mô phỏng trong trường hợp này với một bản đồ không đổi : Array(nrows).map(() => 0), hoặc,Array(nrows).map(function(){ return 0; });
Conor O'Brien

20

Cách dễ nhất:

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

Đây là những gì tôi đạt được:

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

Điều này đánh vần tôi bineeshkumar


2
Lưu ý cách bạn chỉ có thể truy cập vào chỉ mục 0 của mảng cha. Điều này không hữu ích như thứ gì đó cho phép bạn đặt, ví dụ, appVar [5] [9] = 10; ... bạn sẽ nhận được 'Không thể đặt thuộc tính "9" không xác định' với điều này.
RaisinBranCrunch

Nhưng appVar[1][4] = "bineesh";là sai, làm thế nào để giải quyết nó?
Gank

16

Mảng hai chiều được tạo ra giống như cách mảng đơn chiều. Và bạn truy cập chúng như thế nào array[0][1].

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

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

14

Tôi không chắc có ai trả lời được không nhưng tôi thấy điều này hiệu quả với tôi khá nhiều -

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

ví dụ:

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

Ví dụ, đối với mảng 2 chiều.


Làm thế nào tôi có thể làm điều này một cách linh hoạt? Tôi muốn các mảng bên trong với kích thước khác nhau.
alap

3
Bạn không cần thêm dấu phẩy var array = [[],[]]là đủ.
Bánh mì nướng Kaya

13

Để tạo một mảng 2D trong javaScript, trước tiên chúng ta có thể tạo một mảng và sau đó thêm Mảng như các phần tử của nó. Phương thức này sẽ trả về một mảng 2D với số lượng hàng và cột đã cho.

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

để tạo một Array sử dụng phương thức này như dưới đây.

var array = Create2DArray(10,20);

2
Xin vui lòng bạn thêm một số thông tin giải thích vào ansdwer của bạn cho thấy cách thức hoạt động và lý do tại sao nó giải quyết vấn đề. Điều này sẽ giúp những người khác tìm thấy trang này trong tương lai
Người đàn ông của chúng tôi ở Chuối

Khi nào bạn cần một Mảng được khởi tạo trước với một số lượng colums nhất định trong Javascript? Bạn cũng có thể truy cập phần tử thứ n của mảng [].
domenukk

Tôi nhận thấy hàm bắt đầu bằng chữ C, mà (theo một số quy ước nhất định) cho thấy nó sẽ là hàm tạo Hàm và bạn sẽ sử dụng nó với từ khóa mới. Có thể rất nhỏ và hơi có ý kiến, nhưng tôi vẫn sẽ đề xuất từ ​​không viết hoa.
Hachi

12

Để tạo một mảng "2D" không thưa thớt (x, y) với tất cả các chỉ mục có thể định địa chỉ và các giá trị được đặt thành null:

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

Phần thưởng "3D" (x, y, z)

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

Biến thể và sửa chữa về điều này đã được đề cập trong các ý kiến ​​và tại các điểm khác nhau để trả lời cho câu hỏi này nhưng không phải là một câu trả lời thực tế vì vậy tôi đang thêm nó ở đây.

Cần lưu ý rằng (tương tự như hầu hết các câu trả lời khác) điều này có độ phức tạp thời gian O (x * y) nên có lẽ nó không phù hợp với các mảng rất lớn.


1
hãy cẩn thận vì fillđặt cùng một giá trị nếu thay đổi nullthành `object thì nó sẽ là cùng một đối tượng trong mỗi cột
Stanislav Mayorov

@StanislavMayorov Nếu bạn muốn đặt giá trị của từng ô, chỉ cần sử dụng cùng một mẹo:let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
haykam

10

Sử dụng mảng hiểu

Trong JavaScript 1.7 trở lên, bạn có thể sử dụng khả năng hiểu mảng để tạo mảng hai chiều. Bạn cũng có thể lọc và / hoặc thao tác các mục trong khi điền vào mảng và không phải sử dụng các vòng lặp.

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

Bạn có thể tạo bất kỳ n x mmảng nào bạn muốn và điền nó với một giá trị mặc định bằng cách gọi

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

Nhiều ví dụ và tài liệu có thể được tìm thấy ở đây .

Xin lưu ý rằng đây chưa phải là một tính năng tiêu chuẩn .


Kiểm tra nhanh google tại đây ... yup ... fortuyên bố vẫn là một vòng lặp ...
Pimp Trizkit

1
Nó không được hỗ trợ bởi bất kỳ trình duyệt nào - TẠI ĐÂY ?
Kamil Kiełczewski

10

Đối với một người yêu thích lót Array.from ()

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

Một số khác (từ nhận xét của dmitry_romanov) sử dụng Array (). Fill ()

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

Sử dụng toán tử trải rộng ES6 + ("lấy cảm hứng" từ câu trả lời của InspiredJW :))

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

2
chúng ta có thể loại bỏ 0trong fill()chức năng đầu tiên :const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Jinsong Li

8

Cách tiếp cận của tôi rất giống với câu trả lời @Bineesh nhưng với cách tiếp cận tổng quát hơn.

Bạn có thể khai báo mảng kép như sau:

var myDoubleArray = [[]];

Và việc lưu trữ và truy cập nội dung theo cách sau:

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

Điều này sẽ in đầu ra dự kiến

[ 9, 8 ] 9 123

7

Tôi tìm thấy dưới đây là cách đơn giản nhất:

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

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

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

@ KamilKiełczewski bạn nói đúng, có vẻ như điều này chỉ bắt đầu cho mảng đầu tiên, trong lần thứ hai trước khi bạn làm array1[1][100] = 666;, bạn cần phải làm điều này array1[1] = [];.
GMsoF

7

Hiệu suất

Hôm nay 2020.02.05 Tôi thực hiện các thử nghiệm trên MacOs HighSierra 10.13.6 trên Chrome v79.0, Safari v13.0.4 và Firefox v72.0, cho các giải pháp được chọn.

Kết luận cho mảng 2d không khởi tạo

  • giải pháp bí truyền {}/arr[[i,j]](N) là nhanh nhất cho các mảng lớn và nhỏ và có vẻ như nó là lựa chọn tốt cho các mảng lớn thưa thớt
  • các giải pháp dựa trên for-[]/while(A, G) là nhanh chóng và chúng là lựa chọn tốt cho các mảng nhỏ.
  • các giải pháp for-[](B, C) là nhanh chóng và chúng là lựa chọn tốt cho các mảng lớn
  • các giải pháp dựa trên Array..map/from/fill(I, J, K, L, M) khá chậm đối với các mảng nhỏ và khá nhanh đối với các mảng lớn
  • Thật đáng ngạc nhiên for-Array(n)(B, C) trên safari chậm hơn nhiều so với for-[](A)
  • Thật ngạc nhiên for-[](A) cho mảng lớn chậm trên tất cả các trình duyệt
  • giải pháp K chậm đối với mảng nhỏ cho tất cả các trình duyệt
  • các giải pháp A, E, G chậm cho các mảng lớn cho tất cả các trình duyệt
  • giải pháp M chậm nhất cho tất cả các mảng trên tất cả các trình duyệt

nhập mô tả hình ảnh ở đây

Kết luận cho mảng 2d khởi tạo

  • các giải pháp dựa trên for/while(A, B, C, D, E, G) là nhanh nhất / khá nhanh đối với các mảng nhỏ trên tất cả các trình duyệt
  • các giải pháp dựa trên for(A, B, C, E) là nhanh nhất / khá nhanh cho các mảng lớn trên tất cả các trình duyệt
  • các giải pháp dựa trên Array..map/from/fill(I, J, K, L, M) là trung bình nhanh hoặc chậm đối với các mảng nhỏ trên tất cả các trình duyệt
  • các giải pháp F, G, H, I, J, K, L cho các mảng lớn là trung bình hoặc nhanh trên chrome và safari nhưng chậm nhất trên firefox.
  • giải pháp bí truyền {}/arr[[i,j]](N) là chậm nhất đối với các mảng nhỏ và lớn trên tất cả các trình duyệt

nhập mô tả hình ảnh ở đây

Chi tiết

Kiểm tra các giải pháp không lấp đầy (khởi tạo) mảng đầu ra

Chúng tôi kiểm tra tốc độ của các giải pháp cho

  • mảng nhỏ (12 yếu tố) - bạn có thể thực hiện kiểm tra trên máy của mình TẠI ĐÂY
  • mảng lớn (1 triệu phần tử) mảng - bạn có thể thực hiện kiểm tra trên máy của mình TẠI ĐÂY

Kiểm tra các giải pháp điền vào mảng đầu ra (khởi tạo)

Chúng tôi kiểm tra tốc độ của các giải pháp cho

  • mảng nhỏ (12 yếu tố) - bạn có thể thực hiện kiểm tra trên máy của mình TẠI ĐÂY
  • mảng lớn (1 triệu phần tử) mảng - bạn có thể thực hiện kiểm tra trên máy của mình TẠI ĐÂY

nhập mô tả hình ảnh ở đây


6

Javascript không hỗ trợ mảng hai chiều, thay vào đó chúng tôi lưu trữ một mảng bên trong mảng khác và tìm nạp dữ liệu từ mảng đó tùy thuộc vào vị trí của mảng đó bạn muốn truy cập. Ghi nhớ số mảng bắt đầu từ ZERO .

Mã ví dụ:

/* 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 + có thể làm điều này theo cách đơn giản hơn


Tạo 3 x 2 Mảng chứa đầy sự thật

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

Tôi cần thú nhận. Tôi "thông qua" câu trả lời của bạn và thêm vào của tôi , bộ sưu tập một lớp.
tôi-

5

Tôi đã phải tạo một hàm mảng linh hoạt để thêm "bản ghi" vào nó khi tôi cần và để có thể cập nhật chúng và làm bất kỳ phép tính nào tôi cần trước khi tôi gửi nó đến cơ sở dữ liệu để xử lý thêm. Đây là mã, hy vọng nó sẽ giúp :).

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

Vui lòng tối ưu hóa và / hoặc chỉ ra bất kỳ lỗi nào :)


Thế còn aLine.push([clmn1, clmn2, clmn3]);?
Pimp Trizkit

5

Đây là một cách nhanh chóng mà tôi đã tìm thấy để tạo một mảng hai chiều.

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

Bạn cũng có thể dễ dàng biến chức năng này thành chức năng ES5.

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

Tại sao điều này hoạt động: hàm new Array(n)tạo tạo một đối tượng với nguyên mẫu Array.prototypevà sau đó gán cho đối tượng length, dẫn đến một mảng không được điền. Do thiếu thành viên thực tế, chúng tôi không thể chạy Array.prototype.mapchức năng trên nó.

Tuy nhiên, khi bạn cung cấp nhiều hơn một đối số cho hàm tạo, chẳng hạn như khi bạn thực hiện Array(1, 2, 3, 4), hàm tạo sẽ sử dụng argumentsđối tượng để khởi tạo và điền Arraychính xác một đối tượng.

Vì lý do này, chúng ta có thể sử dụng Array.apply(null, Array(x)), bởi vì applyhàm sẽ truyền bá các đối số vào hàm tạo. Để làm rõ, làm Array.apply(null, Array(3))là tương đương với làm Array(null, null, null).

Bây giờ chúng ta đã tạo một mảng dân cư thực tế, tất cả những gì chúng ta cần làm là gọi mapvà tạo lớp thứ hai ( y).


5

Bên dưới một, tạo một ma trận 5x5 và điền chúng với null

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

console.log(md);


3
Câu trả lời này là sai. Nó sẽ tạo ra một mảng với cùng một mảng điền vào các khe của nó. md[1][0] = 3 và tất cả các yếu tố còn lại cũng được cập nhật
Qiang

5

Kích thước hàngcột của một mảng chỉ được biết đến tại thời điểm chạy, sau đó phương thức sau có thể được sử dụng để tạo mảng 2d động .

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

Có một giải pháp khác, đó là không bắt buộc bạn phải xác định trước kích thước của mảng 2d và điều đó rất súc tích.

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

Điều này hoạt động bởi vì, [1,2]được chuyển đổi thành một chuỗi, được sử dụng làm khóa chuỗi cho tableđối tượng.


Câu trả lời này một mình khiến tôi không muốn gặp rắc rối với các mảng "đa chiều" trong JavaScript, ngay cả khi tôi có một giải pháp rất thanh lịch. Điều này cũng minh họa rằng mọi người khác thực sự không tạo ra các mảng đa chiều. một "mảng" trong JavaScript; câu trả lời này sẽ hoàn toàn "mô phỏng" một mảng kích thước vô hạn, kích thước vô hạn của các kích thước và nội dung tùy ý. Tất cả các câu trả lời dựa trên vòng lặp và vòng lặp khác có giới hạn trên thấp hơn nhiều so với kích thước của cấu trúc mảng mà chúng có thể tạo. tốc độ sẽ là một vấn đề lớn đối với các cấu trúc lớn hơn này.
Pimp Trizkit

Thay vào đó, hãy sử dụng dòng này để mô phỏng việc điền trước:var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Pimp Trizkit

Cách hay, sáng tạo để 'mô phỏng' Array2D theo đối tượng :)
Kamil Kiełczewski

4

Để tạo một mảng 4x6, chỉ cần làm điều này

const x = [...Array(6)].map(elem => new Array(4))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.