จะวนซ้ำคีย์และค่าในวัตถุใน CoffeeScript ได้อย่างไร


190

ฉันมีวัตถุ ("เชื่อมโยงอาร์เรย์" เพื่อที่จะพูด - ที่รู้จักกันว่าวัตถุ JavaScript ธรรมดา):

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

ฉันต้องการวนซ้ำobjโดยใช้ CoffeeScript ดังนี้

# CS
for elem in obj

bu รหัส CS ข้างต้นรวบรวมเพื่อ JS:

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

ซึ่งไม่เหมาะสมในกรณีนี้


วิธี JavaScript จะเป็นfor(var key in obj)แต่ตอนนี้ฉันสงสัยว่า: ฉันจะทำเช่นนี้ใน CoffeeScript ได้อย่างไร


4
"อาร์เรย์" ใน JavaScript / CoffeeScript เป็นวัตถุพิเศษที่มีดัชนีตัวเลขและlengthคุณสมบัติที่อ้างถึงดัชนีตัวเลขสูงสุด (บวก 1) สิ่งที่คุณต้องการเป็นเพียง obj = {}"วัตถุ": อาร์เรย์เป็นวัตถุ แต่ไม่มีเหตุผลที่จะใช้หนึ่งในตัวอย่างของคุณ
เทรเวอร์เบิร์นแฮม

1
จุดที่ดีเทรเวอร์! ฉันได้แก้ไขคำถามเพื่อให้เข้าใจผิด / สับสนน้อยลงเล็กน้อยในเรื่องนี้
ต่อ Lundberg

คำตอบ:


351

for x,y of Lใช้ เอกสารที่เกี่ยวข้อง

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

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

เอาท์พุท

jim is 12
john is 7

คุณอาจต้องการพิจารณาตัวแปรfor own k,v of agesตามที่ระบุไว้โดย Aaron Dufour ในความคิดเห็น สิ่งนี้จะเพิ่มการตรวจสอบเพื่อแยกคุณสมบัติที่สืบทอดมาจากต้นแบบซึ่งอาจไม่ใช่ปัญหาในตัวอย่างนี้ แต่อาจเกิดขึ้นได้หากคุณกำลังสร้างสิ่งอื่น ๆ


12
แม่นยำ. CoffeeScript ของofคอมไพล์ของ inJavaScript มันเป็นจุดสับสนทั่วไป แต่การinใช้กับอาร์เรย์มีประโยชน์อย่างไม่น่าเชื่อ ฉันพูดคุยเกี่ยวกับเรื่องนี้ที่มีความยาวในหนังสือ CoffeeScript
เทรเวอร์เบิร์นแฮม

3
คุณไม่ควร Initialise arrเป็นคุณควรใช้arr = [] arr = {}ใน Javascript (และ Coffeescript) อาร์เรย์มีดัชนีตัวเลข วัตถุทำตัวเหมือนเชื่อมโยงอาร์เรย์ / dicts
Morgan Harris

ขอบคุณนั่นถูกชี้โดย Trevor และคนอื่น ๆ แล้วและคำตอบของฉันคือการรักษารหัสคำถามเดิม ฉันจะอัปเดตตัวอย่างของฉันเพื่อใช้วัตถุธรรมดาเพื่อความชัดเจนอยู่แล้ว
Nick

13
แม้ว่ามันจะไม่สำคัญสำหรับตัวอย่างนี้ แต่ดูเหมือนว่าfor own key, value of objจะใกล้เคียงกับ OP ที่ต้องการ
Aaron Dufour

4

คุณกำลังเริ่มต้นอาร์เรย์ แต่จากนั้นคุณใช้มันเหมือนกับวัตถุ (ไม่มี "associative array" ใน js)

ใช้ไวยากรณ์สำหรับการวนซ้ำวัตถุ (เช่น):

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

3
ที่จริงแล้ววัตถุทั้งหมดใน JS คืออาร์เรย์ที่เชื่อมโยงกัน (เรียงลำดับคีย์ที่สอดคล้องกัน) ดังนั้นรหัส jcmoney ที่ให้ควรทำงานได้แม้ว่าจะไม่มีเหตุผลที่จะใช้[]แทน{}ในกรณีนั้น
เทรเวอร์เบิร์นแฮม

jashkenas.github.com/coffee-script/#loopsดูเหมือนว่าลูปที่สร้างโดย coffeescript จะไม่วนซ้ำกับสมาชิกของวัตถุ
kioopi

3

เวอร์ชันมือสั้นโดยใช้ array comprehension ซึ่งสามารถใช้เป็นลูปแบบหนึ่งบรรทัด

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

ความเข้าใจของอาเรย์คือ:

"Comprehensions แทนที่ (และคอมไพล์ลงใน) สำหรับลูปด้วย clause ตัวเลือกเสริมและค่าของดัชนี array ปัจจุบันซึ่งแตกต่างจากลูป comprehensions อาร์เรย์เป็นนิพจน์และสามารถส่งคืนและกำหนด", http://coffeescript.org/ #loops


5
กรุณาอธิบาย. เพียงแค่ให้ข้อมูลโค้ดไม่เพียงพอ stackoverflow ไม่ใช่ไซต์ "gimme the codez" ความคิดคือคนอื่น ๆ จะได้รับประโยชน์มากขึ้นถ้าคำตอบให้ความกระจ่างของแนวคิดนามธรรม
Eliran Malka

1

ด้วยการประชุมของคุณ arr เป็นอาร์เรย์ แต่ "foo" เป็นคุณสมบัติของอาร์เรย์นี้ไม่ใช่ค่าดัชนี หากคุณต้องการเก็บข้อมูลค่าดัชนีของอาเรย์ของคุณคุณควรเขียน:

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

หรือถ้าคุณต้องการอาเรย์แบบเชื่อมโยงให้ใช้อ็อบเจกต์:

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

หากคุณต้องการวนซ้ำ arr1:

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

ผลตอบแทน:

values are : Bar | Foo |

และวนซ้ำเหนือ arr2: "สำหรับค่าในอาร์เรย์"

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

ซึ่งผลตอบแทน:

Foo : Bar
Bar : Foo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.