我有Hash
这个值:
hs = {2012 => [7,nil,3], 2013 => [2, 6, nil, 8], 2014 => [9, 1, 2, 8]}
关键是年。我想向后收集值,直到nil
出现如下:
some_separate_method(hs)
{2013 => [8], 2014 => [9, 1, 2, 8]}
我认为使用reverse_each
并不难实现,但我不能。我该如何制作这样的方法?
使用AmitA的代码,我可以做到。
new_hs = []
hs.reverse_each{|k,v| new_hs << [k,v]; break if v.include?(nil)}
new_hs = Hash[new_hs.sort]
答案 0 :(得分:2)
这个怎么样:
res = {}
hs.to_a.reverse.each do |k, arr|
res[k] = arr.split(nil).last
break unless res[k].length == arr.length
end
答案 1 :(得分:1)
纯Ruby解决方案:
hs.reverse_each.with_object({}) do |(k,v),h|
h[k] = v.dup
ndx = v.rindex(&:nil?)
if ndx
h[k] = h[k][ndx+1..-1]
break h
end
end
#=> {2014=>[9, 1, 2, 8], 2013=>[8]}
v.dup
是为了避免变异hs
。
答案 2 :(得分:0)
这看起来有点长,但我认为它应该可以帮助任何对红宝石有新问题并且有类似问题的人。
def some_separate_method(hs)
new_hash = {}
hs.each do | key, value |
new_arr = []
value.reverse.each do | item |
break if item.nil?
new_arr.unshift(item)
end
new_hash[key] = new_arr
end
new_hash
end
#=> {2012=>[3], 2013=>[8], 2014=>[9, 1, 2, 8]}