Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
哈希数组的ruby哈希设置键_Ruby_Arrays_Hash - Fatal编程技术网

哈希数组的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
相比。原因:每次合并都会更新哈希。