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

aro*_*ick 18 ruby arrays hash

我有一些简单的代码,如下所示:

fruit.each do |c|
  c.each do |key, value|
    puts value
  end
end
Run Code Online (Sandbox Code Playgroud)

这很好用,但感觉不像红宝石.我的目标是采用这个数组:

[{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]
Run Code Online (Sandbox Code Playgroud)

并将其转换为:

[ "1", "2", "3" ]
Run Code Online (Sandbox Code Playgroud)

思考?

wom*_*ton 37

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

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

  • 对于1.9.3,有arr.flat_map(&:值) (8认同)

toh*_*lio 19

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

in = [{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]
out = in.map{ |item| item.values }.flatten
Run Code Online (Sandbox Code Playgroud)

out那将是["1","2","3"].


dal*_*lpo 13

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

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

在这里查看更多信息:http://gistflow.com/posts/578-use-flat_map-instead-of-map-flatten


Orl*_*ndo 5

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

a.map! {|h| h.values}.flatten
Run Code Online (Sandbox Code Playgroud)

这也可以写成

a.map!(&:values).flatten!
Run Code Online (Sandbox Code Playgroud)

还查看注释,在ruby 1.9.3中有一个方法flat_maphttp://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-flat_map)将执行地图和展平一口气。

a.flat_map(&:values)
Run Code Online (Sandbox Code Playgroud)