从哈希数组中获取键的值数组?

时间:2014-02-14 22:19:39

标签: ruby-on-rails ruby arrays

对于这样的数组:

 a = [{a:'a',b:'3'},{a:'b',b:'2'},{a:'c',b:'1'}]

我想返回一个包含:a键值的数组,所以:

 ['a', 'b', 'c']

可以使用以下方式完成:

 a.map{|x|x[:a]}

我想知道Rails或Ruby中是否有一个本机方法可以这样做?

 a.something :a

2 个答案:

答案 0 :(得分:8)

你可以自己做:

class Array
  def get_values(key)
    self.map{|x| x[key]}
  end
end

然后你可以这样做:

a.get_values :a
#=> ["a", "b", "c"]

答案 1 :(得分:1)

在这种情况下,您需要的不仅仅是How to merge array of hashes to get hash of arrays of values,您可以立即获取所有内容:

merged = a.inject{ |h1,h2| h1.merge(h2){ |_,v1,v2| [*v1,*v2] } }
p merged[:a] #=> ["a", "b", "c"]
p merged[:b] #=> ["3", "2", "1"]

此外,如果你使用像Struct或OpenStruct这样的值而不是哈希值,或者任何允许你得到" a"值作为不需要参数的方法 - 您可以使用Symbol#to_proc方便地图:

AB = Struct.new(:a,:b)
all = [ AB.new('a','3'), AB.new('b','2'), AB.new('c','1') ]
#=> [#<AB a="a", b="3">, #<AB a="b", b="2">, #<AB a="c", b="1">]

all.map(&:a) #=> ["a", "b", "c"]
all.map(&:b) #=> ["3", "2", "1"]