哈希数组的ruby哈希设置键
给定以下散列数组,如何使用哈希数组的ruby哈希设置键,ruby,arrays,hash,Ruby,Arrays,Hash,给定以下散列数组,如何使用friend\u 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"=>
friend\u 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"}
我尝试了映射
,但是这些值是在一个数组中。我还尝试将结果展平,但它展平了键,而不是您可以使用的值
你可以使用这个方法
对于这个用例,我认为只使用
#每个:
desired_hash = Hash.new
results.each {|h| desired_hash[h["friend_id"]] = h["dist"]}
然后,所需的_散列为:
#=> {"17"=>"1", "42"=>"1", "43"=>"1", "46"=>"2"}
对于这个用例,我认为只使用#每个:
desired_hash = Hash.new
results.each {|h| desired_hash[h["friend_id"]] = h["dist"]}
然后,所需的_散列为:
#=> {"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') }]
简单地说:
desired_hash = Hash[results.map{ |h| [ h['friend_id'], h['dist']] }]
或者像维克托建议的那样
desired_hash = Hash[results.map{ |x| x.values_at('friend_id', 'dist') }]
或
或
虽然我可能更喜欢@CarySwoveland的答案,但大致如下:
results.each_with_object({}) {|h, n| n[h['friend_id']] = h['dist']}
虽然我可能更喜欢@CarySwoveland的答案,但大致如下:
results.each_with_object({}) {|h, n| n[h['friend_id']] = h['dist']}
我喜欢这种方法,但您必须为results设置一个新变量,并在map
方法中使用它。实际上,它通过向数组中添加所需的散列来变异结果数组:[{“user\u id”=>“18”、“friend\u id”=>“17”、“dist”=>“1”}、{“user\u id”=>“18”、“friend\u id”=>“42”、“dist”=>“1”}、{“user\u id”=>“18”、“friend\u id”=>“friend\u id”=>“43”、“dist”=>“1”、{“user\u id”=>“18”、“friend\friend\u”=>“friend”=>“dist id”=>“2”
('friend_id','dist')
可能更容易,我喜欢这种方法,但您必须为results设置一个新变量,并在map
方法中使用它。实际上,它通过向数组中添加所需的\u散列来变异:[{“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”}
在('friend_id',dist')
上的值可能更容易在每次迭代中合并
效率很低。为什么?请告诉我原因?a=>h2;n=5000000;Benchmark.bm do | x | x.report{for i in 1..n;h1.merge h2;end};x.report{n.times do;h1[:b]=h2[:b];end};end
⇒ 5.870000
vs.0.660025
。原因:每次合并都会更新哈希。merge
每次迭代效率都很低。为什么?你能告诉我原因吗?h1={:a=>1};h2={:b=>2};n=5000000;Benchmark.bm do|x.report{for i in 1..n;h1.merge h2;end};x.report{n.times do;h1[:b]=h2[:b];end};end
⇒ 5.870000
与0.660025
相比。原因:每次合并都会更新哈希。