2012-08-05 39 views
3

我有以下阵列(SQL结果):转换SQL结果散列与ID键使用Ruby

[ 
    {:id => 1, :field1 => "one", :field2 => "two"}, 
    {:id => 2, :field1 => "one", :field2 => "two"}, 
    ... 
] 

我要的是:

{ 
    1 => {:field1 => "one", :field2 => "two"}, 
    2 => {:field1 => "one", :field2 => "two"}, 
    ... 
} 

现在我做如下所示:

data = {} 
result.each do |row| 
    data[row[:id]] = {:field1 => row[:field1], :field2 => row[:field2]} 
end 

我绝对相信这是错误的方法。用Ruby来做这件事的最好方法是什么?是否有像地图或其他东西的任何片段?

回答

1

可能是这样的,也许?

arr = [ 
    {:id => 1, :field1 => "one", :field2 => "two"}, 
    {:id => 2, :field1 => "one", :field2 => "two"} 
] 

hash = arr.each_with_object({}) do |el, memo| 
    id = el.delete(:id) 
    memo[id] = el 
end 

hash # => {1=>{:field1=>"one", :field2=>"two"}, 2=>{:field1=>"one", :field2=>"two"}} 
2

一号线:)

hash = arr.clone.each_with_object({}) { |e,res| res[e.delete(:id)] = e } 

clone是不破坏arr变量

+0

一号线?你可以用0行来做这个吗? – odiszapc 2012-08-06 02:24:18

6
Hash[arr.map { |h| [h.delete(:id), h] }]