Ruby:从哈希 A 到哈希 B 的最快路径

标签 ruby arrays sorting hash

我是 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/

相关文章:

ruby - 访问任意深度的嵌套哈希值的最像 ruby​​ 的方法是什么?

arrays - 捕获数组索引错误

java - 我如何将数组的值设置为我想通过命令调用的变量的名称(在java中)?

javascript - 如何创建一个没有重复对象的新对象数组? (ES6)

c - O(n) 内对字符串指针数组进行排序的算法

javascript - 如何正确链接 lodash 函数调用

ruby-on-rails - 将纯文本转换为 html

Ruby 字符串剥离定义的字符

javascript - 对对象数组进行排序 Angular typescript

ruby - Ruby 中是否有独立的 i18n 库?