สามารถเข้าถึงดัชนีใน Hash แต่ละลูปได้หรือไม่?


119

ฉันอาจจะขาดบางอย่างที่ชัดเจน แต่มีวิธีเข้าถึงดัชนี / จำนวนการวนซ้ำภายในแฮชแต่ละลูปหรือไม่

hash = {'three' => 'one', 'four' => 'two', 'one' => 'three'}
hash.each { |key, value| 
    # any way to know which iteration this is
    #   (without having to create a count variable)?
}

3
อานนท์: ไม่แฮชไม่ได้เรียงลำดับ
Mikael S

แฮชไม่ได้ถูกจัดเรียงในทางเทคนิค แต่ในทับทิมคุณสามารถจัดเรียงได้ตามความหมาย sort () จะแปลงเป็นอาร์เรย์ที่ซ้อนกันซึ่งคุณสามารถแปลงกลับเป็นแฮช: your_hash.sort.to_h
jlesse

คำตอบ:


296

หากคุณต้องการทราบดัชนีของการวนซ้ำแต่ละครั้งคุณสามารถใช้ได้ .each_with_index

hash.each_with_index { |(key,value),index| ... }

24
โดยเฉพาะ:hash.each_with_index { |(key,value),index| ... }
rampion

22
parens จำเป็น b / c hash.eachให้แต่ละคู่คีย์ - ค่าในArrayไฟล์. parens ทำในสิ่งเดียวกับ(key,value) = arrที่วางค่าแรก (คีย์) ลงและที่สองเข้ามาkey value
rampion

1
ขอบคุณ @ S.Mark, @rampion ที่ได้ผล ฉันไม่เห็นeach_with_indexระบุไว้ใน RDOC สำหรับแฮ: ruby-doc.org/core/classes/Hash.html ตอนนี้ฉันเห็นว่าเป็นสมาชิกของ Enumerable แต่แย่มากที่ RDoc ไม่สามารถอ้างอิงข้ามeach_with_indexจาก Hash.html
Upgradingdave

2
@Dave_Paroulek ฉันมักจะปรารถนาเหมือนกัน ฉันพบว่าการตรวจสอบโมดูลหลักด้วยตนเองเป็นขั้นตอนที่จำเป็นเมื่อใช้ vi เพื่อตรวจสอบวิธีการของคลาส บ่อยครั้งที่ฉันแค่ข้ามไปirbและใช้ClassName#instance_methodsเพื่อให้แน่ใจว่าไม่มีอะไรพลาด
rampion

Thx @rampion ClassName#instance_methodsมีประโยชน์มาก
Upgradingdave

11

คุณสามารถทำซ้ำบนคีย์และดึงค่าออกมาด้วยตนเอง:

hash.keys.each_with_index do |key, index|
   value = hash[key]
   print "key: #{key}, value: #{value}, index: #{index}\n"
   # use key, value and index as desired
end

แก้ไข:ตามความคิดเห็นของ rampion ฉันเพิ่งได้เรียนรู้ว่าคุณสามารถรับทั้งคีย์และค่าเป็นทูเปิลได้หากคุณทำซ้ำhash:

hash.each_with_index do |(key, value), index|
   print "key: #{key}, value: #{value}, index: #{index}\n"
   # use key, value and index as desired
end

ลดลงสำหรับการเข้าถึงคอลเลกชันที่วนซ้ำจากภายในลูปและรหัสที่ผิดพลาด: keyในลูปแรกเป็นอาร์เรย์ของคู่คีย์ + ค่าดังนั้นการใช้เป็นดัชนีhashจึงไม่ถูกต้อง คุณเคยทดสอบหรือไม่?
SasQ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.