2012-07-05 40 views
21

Tôi đang cố gắng để đẩy đến một mảng hai chiều mà không có nó rối tung lên, hiện mảng của tôi là:push() một mảng hai chiều

var myArray = [ 
[1,1,1,1,1], 
[1,1,1,1,1], 
[1,1,1,1,1] 
] 

Và mã của tôi Tôi đang cố gắng là:

var r = 3; //start from rows 3 
var c = 5; //start from col 5 

var rows = 8; 
var cols = 7; 

for (var i = r; i < rows; i++) 
{ 
    for (var j = c; j < cols; j++) 
    { 
     myArray[i][j].push(0); 
    } 
} 

Điều đó sẽ dẫn đến việc sau đây:

var myArray = [ 
[1,1,1,1,1,0,0], 
[1,1,1,1,1,0,0], 
[1,1,1,1,1,0,0], 
[0,0,0,0,0,0,0], 
[0,0,0,0,0,0,0], 
[0,0,0,0,0,0,0], 
] 

Nhưng nó không và không chắc chắn cho dù đây là cách chính xác để làm điều đó hay không.

Vì vậy, câu hỏi là làm cách nào để tôi thực hiện việc này?

+2

gì * không * nó làm gì? –

Trả lời

30

Bạn có một số sai sót trong mã của bạn:

  1. Sử dụng myArray[i].push(0); để thêm một cột mới. Mã của bạn (myArray[i][j].push(0);) sẽ hoạt động trong mảng 3 chiều vì nó cố gắng thêm phần tử khác vào mảng tại vị trí [i][j].
  2. Bạn chỉ mở rộng (col-d) -many cột trong tất cả các hàng, ngay cả trong các cột, chưa được khởi tạo và do đó không có mục nhập nào cho đến thời điểm này.

Một đúng, mặc dù phiên bản loại tiết, sẽ là như sau:

var r = 3; //start from rows 3 
var c = 5; //start from col 5 

var rows = 8; 
var cols = 7; 

// expand to have the correct amount or rows 
for(var i=r; i<rows; i++) { 
    myArray.push([]); 
} 

// expand all rows to have the correct amount of cols 
for (var i = 0; i < rows; i++) 
{ 
    for (var j = myArray[i].length; j < cols; j++) 
    { 
     myArray[i].push(0); 
    } 
} 
+3

Ồ, tôi thấy nó hoạt động như thế nào, cảm ơn. – Jo3la

2
var r = 3; //start from rows 3 
var c = 5; //start from col 5 

var rows = 8; 

var cols = 7; 


for (var i = 0; i < rows; i++) 

{ 

for (var j = 0; j < cols; j++) 

{ 
    if(j <= c && i <= r) { 
     myArray[i][j] = 1; 
    } else { 
     myArray[i][j] = 0; 
    } 
} 

} 
+2

(1) bạn có lỗi cú pháp: thiếu '{' trước 'else'. (2) Mã này sẽ không hoạt động, nếu có hàng sẽ được thêm vào: 'ReferenceError: myArray không được định nghĩa'. – Sirko

+1

yea thêm {. Có một lỗi tham chiếu, vì tôi đoán đây là một đoạn mã nội tuyến và các mảng đã tồn tại như chúng cần, liên quan đến đoạn mã ở trên. – Daniel

4

Bạn cần phải lặp qua tất cả các hàng, và thêm các hàng và cột còn thiếu. Đối với các hàng hiện có, bạn lặp từ c đến cols, cho các hàng mới, trước tiên đẩy một mảng trống vào mảng ngoài, sau đó lặp từ 0 đến cols:

var r = 3; //start from rows 3 
var c = 5; //start from col 5 

var rows = 8; 
var cols = 7; 

for (var i = 0; i < rows; i++) { 
    var start; 
    if (i < r) { 
    start = c; 
    } else { 
    start = 0; 
    myArray.push([]); 
    } 
    for (var j = start; j < cols; j++) { 
     myArray[i].push(0); 
    } 
} 
0

bạn đang gọi hàm push() trên phần tử mảng (int), nơi push() nên được gọi là trên mảng, cũng xử lý/điền vào mảng theo cách này chẳng có ý nghĩa bạn có thể làm điều đó như thế này

for (var i = 0; i < rows - 1; i++) 
{ 
    for (var j = c; j < cols; j++) 
    { 
    myArray[i].push(0); 
    } 
} 


for (var i = r; i < rows - 1; i++) 
{ 

    for (var j = 0; j < cols; j++) 
    { 
     col.push(0); 
    } 
} 

bạn cũng có thể kết hợp hai vòng sử dụng nếu điều kiện, nếu hàng < r, nếu hàng khác> = r

+1

Mã bạn đã đưa ra là sai tôi nghĩ. Vui lòng kiểm tra – 999k

4

Lặp lại qua hai chiều có nghĩa là bạn sẽ cần kiểm tra hai chiều.

giả sử bạn đang bắt đầu với:

var myArray = [ 
    [1,1,1,1,1], 
    [1,1,1,1,1], 
    [1,1,1,1,1] 
]; //don't forget your semi-colons 

Bạn muốn mở rộng mảng hai chiều này để trở thành:

var myArray = [ 
    [1,1,1,1,1,0,0], 
    [1,1,1,1,1,0,0], 
    [1,1,1,1,1,0,0], 
    [0,0,0,0,0,0,0], 
    [0,0,0,0,0,0,0], 
    [0,0,0,0,0,0,0], 
]; 

Có nghĩa là bạn cần phải hiểu những gì là sự khác biệt.

Bắt đầu với mảng bên ngoài:

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

Nếu bạn muốn chắc mảng này lâu hơn, bạn cần phải kiểm tra xem nó là chiều dài chính xác, và thêm các mảng nội hơn để tạo nên sự khác biệt:

var i, 
    rows, 
    myArray; 
rows = 8; 
myArray = [...]; //see first example above 
for (i = 0; i < rows; i += 1) { 
    //check if the index exists in the outer array 
    if (!(i in myArray)) { 
     //if it doesn't exist, we need another array to fill 
     myArray.push([]); 
    } 
} 

bước tiếp theo đòi hỏi iterating qua tất cả các cột trong mỗi mảng, chúng tôi sẽ xây dựng dựa trên mã gốc:

var i, 
    j, 
    row, 
    rows, 
    cols, 
    myArray; 
rows = 8; 
cols = 7; //adding columns in this time 
myArray = [...]; //see first example above 
for (i = 0; i < rows; i += 1) { 
    //check if the index exists in the outer array (row) 
    if (!(i in myArray)) { 
     //if it doesn't exist, we need another array to fill 
     myArray[i] = []; 
    } 
    row = myArray[i]; 
    for (j = 0; j < cols; j += 1) { 
     //check if the index exists in the inner array (column) 
     if (!(i in row)) { 
      //if it doesn't exist, we need to fill it with `0` 
      row[j] = 0; 
     } 
    } 
} 
3

Trong trường hợp của bạn, bạn có thể làm điều đó mà không sử dụng push tại tất cả:

var myArray = [ 
    [1,1,1,1,1], 
    [1,1,1,1,1], 
    [1,1,1,1,1] 
] 

var newRows = 8; 
var newCols = 7; 

var item; 

for (var i = 0; i < newRows; i++) { 
    item = myArray[i] || (myArray[i] = []); 

    for (var k = item.length; k < newCols; k++) 
     item[k] = 0;  
} 
+1

Cảm ơn rất hữu ích, bạn có thể xóa các hàng đã thêm không? Có lẽ tôi có thể sử dụng cùng phương thức ở trên nhưng thay vì ghép nối thành mục [k] .splice (k, 1) để xóa các hàng/cột được thêm vào – Jo3la

+1

Vì hàng được thêm vào, bạn có thể sử dụng 'length' để xóa chúng:' myArray .length = 3'; làm cho '5' cuối cùng bị loại bỏ (giả sử bạn có' 8' hàng). – ZER0

+1

Ah ha không nghĩ rằng nó có thể với .length, làm cho nó hoạt động bây giờ ... cảm ơn. – Jo3la

0

Tạo mảng sáng và đặt bên trong những người đầu tiên, trong trường hợp này tôi nhận được dữ liệu từ JSON phản ứng

$.getJSON('/Tool/GetAllActiviesStatus/', 
    var dataFC = new Array(); 
    function (data) { 
     for (var i = 0; i < data.Result.length; i++) { 
      var serie = new Array(data.Result[i].FUNCAO, data.Result[i].QT, true, true); 
      dataFC.push(serie); 
     }); 
Các vấn đề liên quan