【问题标题】:Join two Ruby hashes by keys通过键连接两个 Ruby 哈希
【发布时间】:2017-10-11 20:20:16
【问题描述】:

我有两个看起来像这样的哈希:

h1 = {key1: 'Roses are', key2: 'Violets are'}
h2 = {key1: 'Red', key2: 'Blue'}

我想通过键加入它们,以便得到这样的哈希:

result = {'Roses are' => 'Red', 'Violets are' => 'Blue'}

我有一些代码可以解决问题:

result = {}
h1.each { |key, value| result[value] = h2[key] }

我想知道标准库中是否有方法可以做到这一点,或者是否可以用更少的代码完成。

【问题讨论】:

  • 代码少?这只有2行。如果确实需要,可以使用 each_with_object 将其减少为一行,例如:result = h1.each_with_object({}) {|(key, value), h3| h3[value] = h2[key] }

标签: ruby hash


【解决方案1】:

您需要 1:1 映射,所以 map 可以工作:

h1.map { |k, v| ... }

h1 中的值成为新键:

h1.map { |k, v| [v, ...] }

h2 中的对应值成为新值:

h1.map { |k, v| [v, h2[k]] }
#=> [["Roses are", "Red"], ["Violets are", "Blue"]]

然后to_h 将其转换回哈希:

h1.map { |k, v| [v, h2[k]] }.to_h
#=> {"Roses are"=>"Red", "Violets are"=>"Blue"}

【讨论】:

    【解决方案2】:

    压缩值:

    h1 = {key1: 'Roses are', key2: 'Violets are'}
    h2 = {key1: 'Red', key2: 'Blue'}
    result = h1.values.zip(h2.values).to_h
    

    【讨论】:

    • 谢谢,但是当我在第二个哈希中更改顺序时它不起作用,例如:h2 = {key2:'Blue',key1:'Red'}。
    • @msayen h1.values.zip(h2.values_at(*h1.keys)).to_h 会解决这个问题。 values_at 获取给定键的值(按该顺序)。也许您应该相应地更改您的示例代码,这样我们就不会做出错误的假设。
    猜你喜欢
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2012-02-09
    • 2020-05-28
    • 2011-02-21
    • 2015-01-20
    相关资源
    最近更新 更多