各ループのハッシュでインデックスにアクセスできますか?


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
Anon:いいえ、ハッシュはソートされません。
ミカエルS

ハッシュは厳密にはソートされていませんが、Rubyではある意味でソートできます。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| ... }
2010年

22
括弧は必要ですb / c hash.eachはの各キーと値のペアを提供しArrayます。括弧はと同じこと(key,value) = arrを行い、最初の値(キー)をkeyに入れ、2番目の値をに入れvalueます。
2010年

1
@ S.Mark、@ rampion、ありがとうございました。HDocのeach_with_index RDoc:ruby-doc.org/core/classes/Hash.htmlにリストが表示されませんでした。これでEnumerableのメンバーであることがわかります。しかし、RDocがeach_with_indexHash.htmlから相互参照できないのは残念です。
daveを

2
@Dave_Paroulek私はしばしば同じことを望みました。viを使用してクラスのメソッドをチェックするときに必要な手順は、親モジュールを手動でチェックすることです。多くの場合、私はにスキップしirbClassName#instance_methods見落としがないことを確認するために使用します。
2010年

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

編集:ランピオンのコメントごとに、私はまた、反復すると、キーと値の両方をタプルとして取得できることを学びました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 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.