次のハッシュの配列があるとしましょう。
h = [{"name" => "bob"}, {"car" => "toyota"}, {"age" => "25"}]
そして、私は一致する次のキーを持っています:
k = 'car'
'k'を'h'に一致させ、一致後にすべての要素を削除して、次の値を返すようにするにはどうすればよいですか。
h = [{"name" => "bob"}, {"car" => "toyota"}]
次のハッシュの配列があるとしましょう。
h = [{"name" => "bob"}, {"car" => "toyota"}, {"age" => "25"}]
そして、私は一致する次のキーを持っています:
k = 'car'
'k'を'h'に一致させ、一致後にすべての要素を削除して、次の値を返すようにするにはどうすればよいですか。
h = [{"name" => "bob"}, {"car" => "toyota"}]
ar = [{"name" => "bob"}, {"car" => "toyota"}, {"age" => "25"}]
p ar[0 .. ar.index{|h| h.key?('car')}] #=>[{"name"=>"bob"}, {"car"=>"toyota"}]
ハッシュを配列に変換し、タスクを実行してから元に戻すだけです
h = {"name" => "bob", "car" => "toyota", "age" => "25"}
array = h.to_a.flatten
index = array.index('car') + 1
h = Hash[*array[0..index]]
=> {"name"=>"bob", "car"=>"toyota"}
ちなみに、ハッシュはRuby 1.9からのみ順序付けられています
短くて要点として、私はメガバージョンが好きです。より明確な別のアプローチは、各ハッシュのキー配列を反復処理することです。ハッシュのキーは、順序付けられた配列(http://ruby-doc.org/core-1.9.3/Hash.html)で維持されます。それらは最初に入力されたときによって順序付けられます。その結果、次のことを試すことができます。
newArray = Array.new
h.each do |hash| # Iterate through your array of hashes
newArray << hash
if hash.has_key?("car") # check if this hash is the "car" hash.
break # exits the block
end
end
もちろん、これはすべて、アレイが適切な順序で作成されたかどうかに依存します。もしそうなら、あなたは金色です。
ハッシュは定義上順序付けられていないため、要求する内容は多少未定義です。ただし、ハックのようなことを行うことができます:
h = {"name" => "bob", "car" => "toyota", "age" => "25"}
matched = false
key_given = "car"
h.each do |k,v|
if matched
h.delete(k)
end
if k == key_given
matched = true
next
end
end