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']}
给定以下哈希数组,我如何创建一个以 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']}