2013-05-12 42 views
10

Làm cách nào để tạo một mảng 2D trống trong Javascript (mà không biết có bao nhiêu hàng hoặc cột sẽ có trong mảng mới)?Làm cách nào để tạo mảng 2d trống trong javascript?

Nếu đó là một mảng đơn giản var newArray = new Array(); Tôi có thể chỉ định bao nhiêu thành phần tùy thích. Nhưng những gì về một mảng 2D? Tôi có thể tạo một tài khoản mà không chỉ định số hàng và cột không? và làm cách nào để truy cập các phần tử sau đó (myArray[0][1] hoặc myArray[0,1])?

+1

trùng lặp: http://stackoverflow.com/questions/6495187/best-way-to-generate-empty-2d-array http://stackoverflow.com/questions/7521796/is-it-possible-to -create-an-empty-multidimensional-array-trong-javascript-jquery và nhiều hơn nữa –

+0

Tôi giả định rằng 'var row_major = Array (chiều cao) .map (function() {return Array (width);});' sẽ làm các trick, nhưng cuối cùng cần một mảng 2D ngày hôm nay và thấy rằng nó không. Chỉ trích. –

Trả lời

19

Có, bạn có thể tạo một mảng trống và sau đó đẩy dữ liệu vào đó. Không cần phải xác định độ dài đầu tiên trong JavaScript.
Kiểm tra jsFiddle Live Demo

Xác định:

var arr = [[],[]]; 

Đẩy dữ liệu:

arr[0][2] = 'Hi Mr.A'; 
arr[1][3] = 'Hi Mr.B'; 

đọc dữ liệu:

alert(arr[0][2]); 
alert(arr[1][3]); 
+0

và làm thế nào để chúng ta định nghĩa nó sau đó 'new Array()()'? – meks

+0

@meks Như sau: 'new Array ([])', Xem bản demo. Câu trả lời có giải quyết được vấn đề của bạn không? –

+0

Đối với dân số động của mảng, vui lòng xem câu trả lời của Guffa tại đây. – Pravin

10

Không có mảng hai chiều nào trong Javascript.

Để thực hiện hiệu ứng của một mảng hai chiều, bạn sử dụng một mảng các mảng, còn được gọi là mảng có răng cưa (vì mảng bên trong có thể có độ dài khác nhau).

Một mảng lởm chởm trống được tạo ra giống như bất kỳ mảng trống khác:

var myArray = new Array(); 

Bạn cũng có thể sử dụng một mảng trống đen:

var myArray = []; 

Để đặt bất kỳ mục trong mảng lởm chởm, bạn trước tiên phải đặt các mảng bên trong vào trong đó, ví dụ như thế này:

myArray.push([]); 
myArray[0][0] = 'hello'; 

Bạn cũng có thể tạo mảng có chứa một số mảng trống từ đầu:

var myArray = [[],[],[]]; 

Điều đó cho bạn một mảng răng cưa mà không có bất kỳ mục nào, nhưng được chuẩn bị với ba mảng bên trong.

Vì đó là mảng mảng, bạn truy cập các mục bằng cách sử dụng myArray[0][1].

+0

Cảm ơn Điều này rất hữu ích – meks

+0

Một khái niệm rõ ràng cho mảng 2D. – Pravin

2
var myArray = [ 
    ["cats","dogs","monkeys","horses"], 
    ["apples","oranges","pears","bananas"] 
]; 
document.write(myArray[0][2]) //returns "monkeys" 
19

Bạn có thể tạo 6 x 6 arr trống ay như thế này:

var myarray = [...Array(6).keys()].map(i => Array(6)); 
  • Array(6) tạo ra một mảng với chiều dài = 6 và đầy undefined giá trị.
  • [...Array(6).keys()] cung cấp cho bạn một loạt các số nguyên: [0, 1, 2, 3, 4, 5]
  • Tôi đang ánh xạ mảng đó tới một mảng khác có giá trị undefined.
  • Cuối cùng, chúng tôi nhận được một lưới 6x6 đầy đủ các vị trí undefined.
+1

Bí quyết lừa đảo ngay tại đây ^^^ hoạt động tốt cho các mảng 2D tùy ý. Đây là dạng có thể tái sử dụng: 'const create2dArray = (hàng, cột) => [... Mảng (hàng) .keys()]. ​​Bản đồ (i => Mảng (cột))' – rkd

+0

Giải thích thêm sẽ là tốt đẹp;) –

+1

@ SébastienGarcia-Roméo done =] –

1

Hai điều:

1) Các tài sản dài mảng không đúng báo cáo chiều dài mảng nếu gọi sau var myArray = [[], []]; tuyên bố. Về mặt kỹ thuật, vì các mảng trống được xác định, chúng được tính bằng thuộc tính độ dài, nhưng theo tinh thần của thuộc tính độ dài, nó thực sự cần trả về 0, vì không có phần tử không trống nào được thêm vào bất kỳ mảng nào.

Một công việc tối thiểu xung quanh là sử dụng hai vòng lặp lồng nhau (trong), một cho mảng thứ nhất và một cho mảng thứ 2 và đếm các phần tử không được xác định.

2) Mở rộng ví dụ Siamak A.Motlagh và thêm một mảng ([2] [4]) = 'Xin chào Mr.C'; gán không thành công với "Loại lỗi không xác định: Không thể đặt lỗi thuộc tính '4' không xác định".

Xem jsFiddle: http://jsfiddle.net/howardb1/zq8oL2ds/

Đây là một bản sao của mã mà:

var arr = [[],[]]; 

alert(arr.length); // wrong! 

var c = 0; 
for(var i in arr) 
    for(var j in arr[ i ]) 
    if(arr[ i ][ j ] != undefined) 
     ++c; 
alert(c); // correct 

arr[0][2] = 'Hi Mr.A'; 
alert(arr[0][2]); 

arr[1][3] = 'Hi Mr.B'; 
alert(arr[1][3]); 

arr[2][4] = 'Hi Mr.C'; // At this point I'm getting VM558:62 Uncaught TypeError: Cannot set property '4' of undefined 
alert(arr[2][4]); 

var c = 0; 
for(var i in arr) 
    for(var j in arr[ i ]) 
    if(arr[ i ][ j ] != undefined) 
     ++c; 
alert(c); 

Tại sao sự phân công thứ ba thất bại? Điều gì về câu lệnh tạo [[], []] nói với nó rằng mảng đầu tiên là hợp lệ cho 0 và 1, nhưng không phải 2 hoặc 2 và 3 là ok cho mảng thứ hai, nhưng không phải là 4?

Quan trọng nhất, làm cách nào để xác định một mảng trong một mảng có thể chứa đối tượng ngày trong mảng thứ nhất và thứ hai. Tôi đang sử dụng jQuery-UI DatePicker, dự kiến ​​một mảng ngày, như trong các đối tượng ngày, mà tôi đã mở rộng để sử dụng mảng ngày thứ hai để chứa các đối tượng ngày có chứa thời gian để tôi có thể theo dõi nhiều ngày và nhiều lần mỗi ngày.

Cảm ơn.

3

Giả sử bạn muốn tạo ra một mảng 2ngày (ví dụ: ma trận) đó là 100x100, bạn có thể làm điều đó trong một dòng, như thế này:

//2d matrix in one line var 2darray = new Array(100).fill(null).map(()=>new Array(100).fill(null));

này sẽ tạo ra một ma trận 100x100 của NULL của. Thay thế 100x100 bằng bất kỳ kích thước nào bạn muốn và giá trị rỗng bằng bất kỳ giá trị mặc định nào bạn thích hoặc để trống cho không xác định.

0

này cũng làm việc như là một biểu:

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

Tôi không biết làm thế nào nó Pars về hiệu suất với phần còn lại của câu trả lời ở đây, nếu bạn có một đầu mối cho tôi biết trong các ý kiến.

Nếu bạn không biết độ dài của mảng trước, hãy nhớ rằng bạn có thể sử dụng push([]) hoặc splice() nếu bạn muốn đẩy/xóa/thay thế phần tử mới thay cho phần tử hiện có.

Các vấn đề liên quan