Làm cách nào để lặp lại các khóa và giá trị trong một đối tượng trong CoffeeScript?


189

Tôi có một đối tượng (một "mảng liên kết" có thể nói - còn được gọi là một đối tượng JavaScript đơn giản):

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

Tôi muốn lặp lại objbằng cách sử dụng CoffeeScript như sau:

# CS
for elem in obj

Mã CS ở trên biên dịch thành JS:

// JS
for (i = 0, len = obj.length; i < len; i++)

không phù hợp trong trường hợp này


Cách JavaScript sẽ là 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à các đối tượng đặc biệt có chỉ số bằng số và thuộc lengthtính 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à đối tượng, nhưng không có lý do để sử dụng một trong ví dụ của bạn.
Trevor Burnham

1
Trevor điểm tốt! Tôi đã sửa đổi câu hỏi để ít gây hiểu lầm / khó hiểu hơn về vấn đề này.
Per Lundberg

Câu trả lời:


350

Sử dụng for x,y of L. Tài liệu liên quan .

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 agesnhư được đề cập bởi Aaron Dufour trong các ý kiến. Điều này thêm một kiểm tra để loại trừ các thuộc tính được kế thừa từ nguyên mẫu, có lẽ không phải là vấn đề trong ví dụ này nhưng có thể là nếu bạn đang xây dựng trên các công cụ khác.


12
Đúng. Biên ofdịch của CoffeeScript thành JavaScript in. Đó là một điểm nhầm lẫn phổ biến, nhưng việc insử dụng với các mảng là vô cùng hữu ích. Tôi nói về điều này ở độ dài trong cuốn sách CoffeeScript .
Trevor Burnham

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

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

13
Mặc dù nó không quan trọng đối với ví dụ cụ thể này, nhưng có vẻ như for own key, value of objgần với những gì OP đang tìm kiếm.
Aaron Dufour

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 để lặp qua các đối tượng (đại loại như):

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

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

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

3

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

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

Hiểu mảng là:

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


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

1

với quy ước của bạn, mảng là một mảng, nhưng "foo" là một 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 mình các 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 mảng1:

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

trả về:

values are : Bar | Foo |

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

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

Trả về:

Foo : Bar
Bar : Foo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.