我有一些看起来像这样的简单代码:
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" ]
思想?
答案 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_map
(http://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