假设我有以下哈希数组:
h = [{"name" => "bob"}, {"car" => "toyota"}, {"age" => "25"}]
我有以下要匹配的密钥:
k = 'car'
如何将'k'与'h'匹配并删除匹配后的每个元素,以便它返回:
h = [{"name" => "bob"}, {"car" => "toyota"}]
答案 0 :(得分:3)
只需将哈希转换为数组,执行任务然后转换回来
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
之后才被排序答案 1 :(得分:3)
ar = [{"name" => "bob"}, {"car" => "toyota"}, {"age" => "25"}]
p ar[0 .. ar.index{|h| h.key?('car')}] #=>[{"name"=>"bob"}, {"car"=>"toyota"}]
答案 2 :(得分:2)
我喜欢megas'版本,因为它简短而重要。另一种更明确的方法是迭代每个哈希的键数组。哈希的键维护在有序数组(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
这当然取决于数组是否以正确的顺序创建。如果是的话,那你就是金色的。
答案 3 :(得分:0)
根据定义,散列是无序的,因此您请求的内容有些未定义。但是你可以做一些像黑客一样的事情:
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
答案 4 :(得分:0)
我来这里的派对已经很晚了。我一直在寻找解决同样问题的方法,但我并不喜欢这些答案。所以,这是我的方法:
class Array
def take_until(&blk)
i = find_index &blk
take(i + 1)
end
end
h = [{"name" => "bob"}, {"car" => "toyota"}, {"age" => "25"}]
k = 'car'
h.take_until { |x| x.has_key?(k) }
=> [{"name"=>"bob"}, {"car"=>"toyota"}]