2010-12-11 39 views
5

Tôi tạo ra các mảng 2D sau trong JavascriptTăng cường cho vòng lặp trong mảng 2D - JavaScript

// Create basic linear array 
var ImgArray = new Array(4); 

// Do the 2D array for each or the linear array slots 
for (i=0; i < 4 ; i++) { 
    ImgArray[i] = new Array(4) 
} 

Bây giờ tôi muốn lặp qua nó sử dụng 2 'tăng cường cho vòng'. Nhưng bị mắc kẹt về cách sử dụng vòng lặp vì chỉ có ImgArray đã nêu như vậy. Ví dụ;

// Load the images 
for(var i in ImgArray) { 
    for(???) {   // How would i do this? What do i state as an array? 
      ///... 
    } 
    document.write("<br>"); 
} 

Bất kỳ khuyên cũng đánh giá cao

+0

Ngoài ra: ngừng sử dụng 'document.write()' - nó khá ác :-) – Pointy

+0

document.write là OK, "tăng cường cho vòng" (cho ... trong mảng) là không. –

+1

@Pointy: Không có gì sai với 'document.write', được sử dụng một cách thích hợp. –

Trả lời

16

Giả sử các mảng bạn đã tạo, vòng lặp trông như thế này:

var i, j, entry, ImgArray; 

// Create the array 
ImgArray = new Array(4); 
for (i=0; i < 4 ; i++) { 
    ImgArray[i] = new Array(4); 
} 

// Loop through both dimensions 
for (i = 0; i < ImgArray.length; ++i) { 
    entry = ImgArray[i]; 
    for (j = 0; j < entry.length; ++j) { 
     // Do something with entry[j] 
    } 
} 

Điều này là do có không mảng hai chiều trong JavaScript. (Trong thực tế, ngay cả arrays aren't really arrays, nhưng chúng ta hãy không đi đến đó.) Có "mảng", và một mục nhập mảng có thể là một mảng khác, nhưng một mục nhập mảng có thể dài hơn hoặc ngắn hơn so với các mảng khác. Vì vậy, bạn lấy mảng và vòng lặp đó thông qua chiều dài của nó, có thể khác với độ dài khác trong cùng một "thứ nguyên".

Lưu ý rằng tôi đã không sử dụng for..in ở trên. Đừng sử dụng for..in để lặp qua các mảng trừ khi bạn thực sự biết mình đang làm gì; details here. (Nếu bạn làm thực sự biết mình đang làm gì và có biện pháp phòng ngừa đầy đủ, thì tốt, nhưng mã được trích dẫn của bạn không thực hiện các biện pháp phòng ngừa cần thiết.) for..in không không lặp lại các chỉ mục của một mảng, nó liệt kê thuộc tính tên của một đối tượng.

Tắt chủ đề # 1: Trong JavaScript, quy ước (bạn tự do bỏ qua) chỉ sử dụng mũ ban đầu (ImgArray) cho hàm hàm dựng.

Tắt chủ đề # 2: Bạn có thể xem bằng cách sử dụng mảng chữ ([entry, entry, entry]) thay vì new Array(...), nhưng tùy thuộc vào việc bạn đang làm.

Tắt chủ đề # 3: Bạn nên dựa vào việc chèn dấu chấm phẩy (như với dòng ImgArray[i] = new Array(4)). Hãy chắc chắn để đưa vào dấu chấm phẩy nơi họ đang cần thiết, hoặc bạn sẽ thấy rằng bạn không thể giảm thiểu kịch bản của bạn đúng cách và/hoặc rằng bạn sẽ chống lại các lỗi lẻ lãng phí thời gian của bạn.:-)

+3

+1, cũng trên chủ đề # 1: không sử dụng 'for ... in' để lặp qua mảng. (mã của bạn nói rằng, nhưng tôi nghĩ tôi chỉ cần thêm nó trong lời nói) – casablanca

+0

@casablanca: LOL Tôi chỉ thấy rằng ông đã sử dụng và đã được thêm nó như bạn đã nhận xét. :-) Tốt nếu bạn hiểu những gì bạn đang làm và xử lý nó đúng cách, nhưng hầu hết mọi người * không * hiểu những gì họ đang làm và * không * xử lý tài sản, vì vậy ... –

+1

@Carlos: Bạn có thể làm 'imgArray [1] [3]'. 'imgArray [1]' trả về một mảng và 'imgArray [1] [3]' truy cập phần tử thứ tư của mảng này. –

3

Đó không phải là một "tăng cường for loop". Bạn không nên lặp lại thông qua các cá thể Array theo cách đó, ít nhất là không khi bạn xử lý chúng theo ngữ nghĩa như các mảng được lập chỉ mục nguyên.

Sử dụng cách tiếp cận ban đầu

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

của bạn (và đừng quên var). Cũng đừng bận tâm với

var ImgArray = new Array(4); 

Chỉ cần viết

var ImgArray = []; 
1

bạn chỉ phải làm một vòng lặp for cho cả như vậy

for (var i in array){ 
    for(var j in array[i]){//do stuff here} 
} 
+0

hãy sử dụng 'hasOwnProperty' với điều này, để thận trọng – vsync

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