ruby 为哈希数组设置哈希键

ruby set key of hash for array of hashes

给定以下哈希数组,我如何创建一个以 friend_id 为键、dist 为值的新哈希?

results = [
 {"user_id"=>"18", "friend_id"=>"17", "dist"=>"1"},
 {"user_id"=>"18", "friend_id"=>"42", "dist"=>"1"},
 {"user_id"=>"18", "friend_id"=>"43", "dist"=>"1"},
 {"user_id"=>"18", "friend_id"=>"46", "dist"=>"2"}
]

desired_hash = {"17" => "1", "42" => "1", "43" => "1", "46" => "2"}

我已经尝试过 map,但是这些值然后在一个数组中。我也尝试 flatten 结果,但它压平了键而不是值

您可以使用Enumerable#inject方法。

results.inject({}) {|sum, e| sum.merge({e["friend_id"] => e["dist"]})}
# => {"17"=>"1", "42"=>"1", "43"=>"1", "46"=>"2"}

对于这个用例,我认为只使用 #each:

会更简单且更具可读性
desired_hash = Hash.new
results.each {|h| desired_hash[h["friend_id"]] = h["dist"]}

那么,desired_hash就是:

#=> {"17"=>"1", "42"=>"1", "43"=>"1", "46"=>"2"} 

简单地说:

desired_hash = Hash[results.map{ |h| [ h['friend_id'], h['dist']] }]

或者按照维克多的建议

desired_hash = Hash[results.map{ |x| x.values_at('friend_id', 'dist') }]
results.each_with_object({}) { |g,h| h[g["friend_id"]] = g["dist"] }

results.each_with_object({}) { |g,h| h.update(g["friend_id"]=> g["dist"]) }
results.map {|h| [h['friend_id'], h['dist']]} .to_h

尽管我可能更喜欢@CarySwoveland 的回答,但大致如下:

results.each_with_object({}) {|h, n| n[h['friend_id']] = h['dist']}