在红宝石中展平一系列哈希

时间:2009-06-24 01:10:43

标签: ruby arrays hash

我有一些看起来像这样的简单代码:

fruit.each do |c|
  c.each do |key, value|
    puts value
  end
end

这很好用,但感觉不像红宝石。我的目标是采用这个阵列:

[{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]

并将其转换为:

[ "1", "2", "3" ]

思想?

6 个答案:

答案 0 :(得分:37)

如果它在Rails中或者你已经定义了to_proc,那么你可以比@ toholio的解决方案更短一些:

arr = [{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]
out = arr.map(&:values).flatten # => ["1", "2", "3"]

答案 1 :(得分:19)

因此,您希望将每个哈希值转换为其值,然后使用其他哈希值中的值进行连接?

in = [{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]
out = in.map{ |item| item.values }.flatten

out将为["1","2","3"]

答案 2 :(得分:12)

@wombleton @aronchick我建议使用“flat_map(&:values)”代替“map(&:values).flatten”以获得更好的性能。

arr = [{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]
out = arr.flat_map(&:values)

请点击此处了解详情:http://gistflow.com/posts/578-use-flat_map-instead-of-map-flatten

答案 3 :(得分:5)

如果使用map!,则不在内存中创建另一个数组

a.map! {|h| h.values}.flatten

这也可以写成

a.map!(&:values).flatten!

同时查看评论,红宝石1.9.3中的一个名为flat_maphttp://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-flat_map)的方法将执行地图并在一次调用中展平。

a.flat_map(&:values)

答案 4 :(得分:4)

a.inject([]) { |mem,obj| mem += obj.values }

答案 5 :(得分:0)

它不会有太大变化,但您可以使用map

x.map do |fruit|
    fruit.each { |k,v| puts v }
end