2013-04-06 27 views
5

Tôi có một mảng như vậyforeach không hoạt động khi vòng lặp for thực hiện với một mảng của các đối tượng

var updates = []; 

tôi sau đó thêm công cụ để các mảng như thế này

updates["func1"] = function() { x += 5 }; 

Khi tôi gọi là chức năng với vòng lặp for nó hoạt động như mong đợi

for(var update in updates) { 
    updates[update](); 
} 

Nhưng khi tôi sử dụng forEach nó không hoạt động !?

updates.forEach(function (update) { 

    update(); 
}); 

forEach chắc chắn hoạt động trong trình duyệt của tôi là google chrome, tôi đang làm gì sai?

Trả lời

9

forEach lặp lại trên indexes không quá properties. Mã của bạn:

updates["func1"] = "something"; 

Thêm thuộc tính vào một đối tượng - ngẫu nhiên là mảng - không phải là thành phần của mảng. Trong thực tế, đó là tương đương với:

updates.func1 = "something"; 

Nếu bạn cần một cái gì đó giống như một hashmap, sau đó bạn có thể sử dụng một đối tượng đơn giản thay vì:

updates = {}; 

updates["func1"] = "something"; 

Và sau đó lặp sử dụng for…in, mà shouldn't be used on arrays

Hoặc bạn có thể sử dụng Object.keys để truy xuất thuộc tính một lần lặp qua chúng:

Object.keys(updates).forEach(function(key) { 
    console.log(key); 
}); 
+0

Cảm ơn bạn điều này đã giúp tôi hiểu nó tốt hơn rất nhiều, tôi đọc tôi không nên sử dụng 'cho ... in' đó là lý do tại sao tôi hỏi câu hỏi, vì vậy cảm ơn cho các thay thế cho' cho ... trong' :) – GriffLab

5

Bạn không thêm các mục vào mảng, bạn đang thêm thuộc tính đối tượng vào đối tượng mảng của mình. for .. in sẽ trả về tất cả các thuộc tính, forEach chỉ lặp qua các phần tử mảng.

Để thêm vào mảng, bạn sẽ làm điều này:

updates.push(function() { x += 5 }); 

Nếu bạn có ý định thêm theo cách bạn đang có, sau đó chỉ cần sử dụng một đối tượng và không phải là một mảng:

var updates = {} 

và sau đó sử dụng for ... in.

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