我是 ruby 的新手,正在寻找一种优雅的方法来对以下哈希进行排序。
哈希 A:
a = { :metric1 => {
"Bob" =>10,
"Jane" =>15,
"Sally" =>20
},
:metric2 => {
"Jane" =>15,
"Bob" =>10,
"Sally" =>10
},
:metric3 => {
"Bob" =>10,
"Sally" =>10,
"Jane" =>5
}
}
哈希 B:
b = { "Bob" => {
:metric1 =>10,
:metric2 =>10,
:metric3 =>10
},
"Jane" => {
:metric1 =>15,
:metric2 =>15,
:metric3 =>5
},
"Sally" => {
:metric1 =>20,
:metric2 =>10,
:metric3 =>10
}
}
本质上,我想要一种简单的方法来迭代此对象以输出如下表格:
Metric 1 Metric 2 Metric 3
Bob 10 20 20
Jane 15 15 5
Sally 20 10 10
最佳答案
函数式方法(假设所有人都有相同的指标键):
names = a.values.first.keys
b = Hash[names.map do |name|
[name, Hash[a.map { |metric, values| [metric, values[person]] }]]
end]
[编辑] 第二种方法,可能比我的第一次尝试更正统。它使用 Facets(因此对于那些不熟悉它产生的新抽象的人来说,它可能看起来有点神秘)。但是,如果您检查每个步骤的输出,就很容易了:
triplets = a.flat_map { |metric, h| h.map { |name, value| [name, metric, value] } }
pairs_by_name = triplets.map_by { |name, metric, value| [name, [metric, value]] }
b = pairs_by_name.mash { |name, pairs| [name, pairs.to_h] }
关于Ruby:从哈希 A 到哈希 B 的最快路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7973483/