我有一些简单的代码,看起来像这样:
fruit.each do |c|
c.each do |key, value|
puts value
end
end
这样做是可行的,但感觉不够符合 Ruby 的风格。我的目标是将这个数组:
[{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]
将其转换为以下内容:
[ "1", "2", "3" ]
你的想法呢?
如果是在Rails中或者你已经定义了to_proc,那么你可以用比@toholio的解决方案更简短的方式:
arr = [{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]
out = arr.map(&:values).flatten # => ["1", "2", "3"]
所以你希望将每个哈希转换为其值,然后与其他哈希的值连接起来吗?
in = [{"fruit_id"=>"1"}, {"fruit_id"=>"2"}, {"fruit_id"=>"3"}]
out = in.map{ |item| item.values }.flatten
out
将会是["1","2","3"]
。
@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
如果你使用map!,就不会在内存中创建另一个数组。
a.map! {|h| h.values}.flatten
a.map!(&:values).flatten!
看了一下评论,ruby 1.9.3中有一个方法叫做flat_map
(http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-flat_map),它可以在一次调用中完成映射和展平操作。
a.flat_map(&:values)
a.inject([]) { |mem,obj| mem += obj.values }
这不会改变太多,但你可以使用map
:
x.map do |fruit|
fruit.each { |k,v| puts v }
end
arr.flat_map(&:values)
的表达式。 - jtzero