由零分开的哈希数组

时间:2015-11-14 01:49:46

标签: ruby-on-rails ruby

我有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]

3 个答案:

答案 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]}