2011-06-20 44 views
178

tôi có một đối tượng (một "sư mảng", còn được gọi là một đối tượng Javascript đơn giản):lặp trên Object trong coffeescript

obj = {} 
obj["Foo"] = "Bar" 
obj["bar"] = "Foo" 

và tôi cần để lặp qua nó bằng cách sử coffeescript. Bây giờ, làm như thế này:

for elem in obj 

không hoạt động vì obj.length là 0, mã biên dịch js sử dụng. Trong Javascript bình thường tôi chỉ sẽ làm

for(var key in obj) 

nhưng bây giờ tôi đang tự hỏi: làm thế nào tôi có thể làm điều này trong coffeescript?

+4

"Mảng" trong JavaScript/CoffeeScript là những đối tượng đặc biệt với chỉ số bằng số và một 'tài sản length' chỉ đơn giản đề cập đến chỉ số số cao nhất (cộng 1). Những gì bạn muốn chỉ là một "đối tượng": 'obj = {}'. Mảng là các đối tượng, nhưng không có lý do gì để sử dụng nó trong ví dụ của bạn. –

+1

Điểm tốt Trevor! Tôi đã sửa đổi các câu hỏi để được một chút ít gây hiểu lầm/khó hiểu trong lĩnh vực này. –

Trả lời

333

Sử dụng for x,y of L. Relevant documentation.

ages = {} 
ages["jim"] = 12 
ages["john"] = 7 

for k,v of ages 
    console.log k + " is " + v 

Đầu ra

jim is 12 
john is 7 

Bạn cũng có thể muốn xem xét các biến thể for own k,v of ages như đã đề cập bởi Aaron Dufour trong các ý kiến. Điều này cho biết thêm một kiểm tra để loại trừ các thuộc tính thừa hưởng từ nguyên mẫu, có lẽ không phải là một vấn đề trong ví dụ này, nhưng có thể nếu bạn đang xây dựng trên đầu trang của các công cụ khác.

+12

Chính xác. 'Biên dịch' của CoffeeScript thành 'in' của JavaScript. Đó là một điểm chung của sự nhầm lẫn, nhưng có 'in' để sử dụng với mảng là vô cùng hữu ích. Tôi nói về điều này ở độ dài trong [sách CoffeeScript] (http://pragprog.com/titles/tbcoffee/coffeescript). –

+3

Bạn không nên khởi tạo 'arr' là' arr = [] ', bạn nên sử dụng' arr = {} '. Trong các mảng Javascript (và Coffeescript) có các chỉ số dạng số. Các đối tượng hoạt động giống như mảng kết hợp/dicts. –

+0

Cảm ơn, điều đó đã được chỉ ra bởi Trevor và những người khác, và câu trả lời của tôi đã được giữ lại cho mã câu hỏi ban đầu. Tôi sẽ cập nhật ví dụ của tôi để sử dụng một đối tượng đơn giản để làm rõ. – Nick

4

Bạn đang khởi tạo một mảng, nhưng sau đó bạn đang sử dụng nó như một đối tượng (không có "mảng kết hợp" trong js).

Sử dụng cú pháp cho iterating trên đối tượng (một cái gì đó tương tự):

for key, val of arr 
    console.log key + ': ' + val 
+3

Trên thực tế, * tất cả * đối tượng trong JS là các mảng liên kết (có thứ tự khóa nhất quán). Vì vậy, mã jcmoney đã cho nên hoạt động, mặc dù không có lý do gì để sử dụng '[]' thay vì '{}' trong trường hợp đó. –

+0

http://jashkenas.github.com/coffee-script/#loops giống như vòng lặp được tạo bởi coffeescript sẽ không lặp qua các thành viên đối tượng. – kioopi

2

Phiên bản ngắn tay bằng cách sử dụng hiểu mảng, có thể được sử dụng làm vòng lặp một dòng.

console.log index + ": " + elm for index, elm of array 

Mảng hiểu là:.

"comprehensions thay thế (và biên dịch thành) cho vòng, với tùy chọn khoản bảo vệ và giá trị của chỉ số mảng hiện tại Không giống như cho vòng, comprehensions mảng là biểu thức, và có thể được trả lại và giao. ", http://coffeescript.org/#loops

+4

hãy giải thích. chỉ đơn thuần cung cấp đoạn mã không đủ. stackoverflow không phải là một "gimme the codez" trang web, ý tưởng là những người khác sẽ được hưởng lợi nhiều hơn nếu câu trả lời cung cấp một làm rõ khái niệm trừu tượng. –

+2

"Tôi có thể làm mờ lời giải thích" không – makdad

1

với ước của bạn, arr là một rray, nhưng "foo" là thuộc tính của mảng này, nó không phải là một giá trị được lập chỉ mục. Nếu bạn muốn lưu trữ dữ liệu của bạn những giá trị được lập chỉ mục của một mảng, bạn nên đã viết:

arr1 = [] 
arr1[0] = "Bar" 
arr1[1] = "Foo" 

hoặc nếu bạn muốn một mảng kết hợp, chỉ cần sử dụng một đối tượng:

arr2 = {} 
arr2["Foo"] = "Bar" // equivalent to arr2.foo="Bar" 
arr2["bar"] = "Foo" // equivalent to arr2.bar="Foo" 

nếu bạn muốn để lặp qua arr1:

str = "values are : " 
for val in arr2 
    str += val + " |" 
console.log key + ': ' + val 

lợi nhuận:

values are : Bar | Foo | 

và để lặp qua arr2: "cho giá trị trong mảng"

for key, val of arr 
    console.log key + ': ' + val 

trả về:

Foo : Bar 
Bar : Foo 
Các vấn đề liên quan