Tìm kiếm trang web

Khai báo một mảng hai chiều rỗng trong Javascript?


Tôi muốn tạo một mảng hai chiều trong Javascript nơi tôi sẽ lưu trữ các tọa độ (x,y). Tôi vẫn chưa biết sẽ có bao nhiêu cặp tọa độ vì chúng sẽ được tạo ra động thông qua nhập liệu của người dùng.

Ví dụ về mảng 2 chiều đã được định nghĩa trước:

var Arr=[[1,2],[3,4],[5,6]];

Tôi đoán tôi có thể sử dụng phương thức PUSH để thêm một bản ghi mới vào cuối mảng.

Làm thế nào để tôi khai báo một mảng hai chiều rỗng sao cho khi tôi sử dụng Arr.push() đầu tiên nó sẽ được thêm vào chỉ mục 0, và mọi bản ghi tiếp theo được ghi bằng push sẽ lấy chỉ mục tiếp theo?

Điều này có lẽ rất dễ làm, tôi chỉ là người mới với JS, và tôi sẽ rất cảm kích nếu ai đó có thể viết một đoạn mã ngắn hoạt động mà tôi có thể xem xét. Cảm ơn

Câu trả lời #1

Bạn có thể chỉ cần khai báo một mảng thông thường như sau:

var arry = [];

Sau đó, khi bạn có một cặp giá trị để thêm vào mảng, tất cả những gì bạn cần làm là:

arry.push([value_1, value2]);

Và đúng, lần đầu tiên bạn gọi arry.push, cặp giá trị sẽ được đặt tại chỉ mục 0.

Từ nodejs repl:

> var arry = [];
undefined
> arry.push([1,2]);
1
> arry
[ [ 1, 2 ] ]
> arry.push([2,3]);
2
> arry
[ [ 1, 2 ], [ 2, 3 ] ]

Tất nhiên, vì JavaScript là ngôn ngữ kiểu động, sẽ không có trình kiểm tra kiểu nào đảm bảo rằng mảng vẫn giữ được cấu trúc 2 chiều. Bạn sẽ phải tự đảm bảo chỉ thêm các cặp tọa độ và không làm những điều sau:

> arry.push(100);
3
> arry
[ [ 1, 2 ],
  [ 2, 3 ],
  100 ]

Câu trả lời #2

Nếu bạn muốn khởi tạo cùng với việc tạo, bạn có thể sử dụng fill và map.

const matrix = new Array(5).fill(0).map(() => new Array(4).fill(0));

5 là số hàng và 4 là số cột.

Câu trả lời #3

ES6

Ma trận m có kích thước 3 hàng và 5 cột (xóa .fill(0) để không khởi tạo bằng số 0)

[...Array(3)].map(_=>Array(5).fill(0))       

let Array2D = (r,c) => [...Array(r)].map(_=>Array(c).fill(0));

let m = Array2D(3,5);

m[1][0] = 2;  // second row, first column
m[2][4] = 8;  // last row, last column

// print formated array
console.log(JSON.stringify(m)
  .replace(/(\[\[)(.*)(\]\])/g,'[\n  [$2]\n]').replace(/],/g,'],\n  ')
);

Câu trả lời #4

Nếu bạn muốn có thể truy cập ma trận như sau:

matrix[i][j]

Tôi thấy tiện nhất là khởi tạo nó trong một vòng lặp.

var matrix = [],
    cols = 3;

//init the grid matrix
for ( var i = 0; i < cols; i++ ) {
    matrix[i] = []; 
}

Điều này sẽ cho bạn

[ [], [], [] ]

vậy

matrix[0][0]
matrix[1][0]

trả về undefined và không phải lỗi "Uncaught TypeError: Cannot set property '0' of undefined".

Câu trả lời #5

Bạn có thể lồng một mảng vào trong mảng khác bằng cách sử dụng cú pháp viết tắt:

   var twoDee = [[]];

Bài viết liên quan