2011-09-24 14 views
5

Tôi đang tạo hệ thống danh sách phát nơi mỗi bài hát có một ID duy nhất. Khi bạn thêm một bài hát vào mảng danh sách phát, chỉ mục của nó được đăng ký làm ID của nó.Cách lặp qua đối tượng trong javascript với chỉ mục không theo thứ tự

Thông thường khi lặp qua một mảng javascript, bạn lấy chiều dài và đếm lên thông qua chỉ mục. Có cách nào để lặp qua một mảng với các chỉ mục không sử dụng? Đó là thực hành xấu vì bất kỳ lý do gì?

+0

Tất cả các mảng javascript là liên kết, bạn không cần sử dụng chỉ mục đếm ngược. – Perception

+0

@Perception: Vô nghĩa. Javascript 'mảng' có tuần tự, chỉ số. Có lẽ bạn đang đề cập đến các đối tượng chung hơn. Một lỗi phổ biến. –

+0

@Perception Thực sự không có thứ gì như một mảng hoặc mảng liên kết. Tất cả các đối tượng là hầu hết các hashtables. đối tượng mảng trong Javascript chỉ có một vài phương thức để hoạt động như một mảng ở bên ngoài. – Jonathan

Trả lời

5
var obj = {"123": "Lalala", 
      "456": "dum dum"}; 
for(var i in obj){ 
    //i = ID 
    // obj[i] = "song" 
} 

Sử dụng for(var i in obj) để lặp qua một đối tượng. Xem các ý kiến ​​ở trên để hiểu ý nghĩa của điều này for -statement.

Bạn đang nói về đối tượng, không mảng, bằng cách này:

var array = [7, 5, 9]; 

Một mảng có thể được mô phỏng theo cách này, vì vậy mà một for(var i=0; i<array_like.length; i++) có thể được sử dụng. chức năng mảng (như pop) không thể được sử dụng trên họ, trừ khi bạn định nghĩa nó:

var array_like = {0:7, 1:5, 2:9, length:3}; 
+0

Cảm ơn rất nhiều. Đối với ... trông giống như giải pháp của tôi. Cũng cảm ơn vì đã sửa tôi. –

+0

Điều này không quan trọng trong trường hợp này, nhưng đừng quên kiểm tra hasOwnProperty theo cách tiếp cận chung để sử dụng cho ... trong –

-1

Giả sử mảng của bạn là ở dạng:

array['id1'] = 'val1'; 
array['id2'] = 'val2'; 
array['id3'] = 'val3'; 

Bạn có thể lặp qua các giá trị bằng cách sử dụng:

for (var id in array) { 
    document.write(id + ' – ' + array[id]); 
} 
+0

Đó không thể là một mảng, mà là một đối tượng. –

4

Bạn có thể truy cập thuộc tính của đối tượng theo một trong hai cách. Hoặc sử dụng "." chẳng hạn như:

var my prop = obj.property; 

Hoặc qua ký hiệu khung:

var my prop = obj["property"]; 

Bây giờ, điều đó không thực sự trả lời câu hỏi của bạn. Vì vậy, đây là một vài cách sau:

Sử dụng jQuery mỗi chức năng:

$.each(obj, function(key, value){ 
    //Do something with your key and value. 
}); 

Sử dụng Javascript cho chức năng:

for(var key in obj) 
{ 
    var value = obj[key]; 
    //Do something with your key and value. 
} 

Hy vọng rằng sẽ giúp!

+0

Cảm ơn. Đối với ... trong dường như là con đường để đi. Một điều mặc dù: bằng cách sử dụng $ .each với jquery dường như cư xử theo cùng cách mà sử dụng một vòng lặp thông thường, trong đó nó sẽ bắt đầu bằng 0 và đếm lên qua chiều dài của nó. –

0

bạn cũng có thể làm chỉ là 'cho mỗi' để lặp qua chỉ tính giá trị:

var obj = { "key1": "VAL1", "khóa2": "VAL2"};

cho mỗi (var giá trị trong obj) { .... }

Nhưng trong trường hợp này, bạn không thể truy cập vào một tên thuộc tính.

+0

-1 cho từ khóa không chính xác - nó chỉ dành cho, không có "mỗi" cần thiết. –

+0

Có hai loại cho: 'for' - lặp qua các chỉ mục, và 'cho mỗi' - lặp qua các giá trị. Nhưng 'cho mỗi' không được hỗ trợ trong phiên bản cũ của IE. Tại sao bạn nghĩ đó là từ khóa không chính xác? – timestopper

+0

'cho mỗi' là phần mở rộng dành riêng cho ngôn ngữ của Mozilla và cung cấp ít hoặc không có lợi ích nào so với cú pháp' for ... in' chuẩn có sẵn trong ECMA và tất cả các công cụ JS hiện tại. –