【问题标题】:Ruby - Merge two hashes with no like keys based on matching valueRuby - 根据匹配值合并两个没有相似键的哈希
【发布时间】:2016-06-01 23:30:52
【问题描述】:

我想找到一种将两个哈希合并在一起的有效方法,并且生成的哈希必须包含所有原始数据和一个新的键/值对,基于以下标准。两个散列之间没有共同的键,但是一个散列中的键与相邻散列中的键的值匹配。

还要注意,第二个哈希实际上是一个哈希数组。

我正在处理一个相对较大的数据集,因此正在寻找一种有效的解决方案,但希望同时保持代码的可读性,因为它可能最终会投入生产。

这是我的数据结构:

# Hash
hsh1 = { "devicename1"=>"active", "devicename2"=>"passive", "devicename3"=>"passive" }

# Array of Hashes
hsh2 = [ { "host" => "devicename3", "secure" => true  },
         { "host" => "devicename2", "secure" => true  },
         { "host" => "devicename1", "secure" => false } ]

这是我需要完成的工作:

我需要将hsh1 中的数据合并到hsh2 中,将所有原始键/值对保留在hsh2 中,并使用hsh1 中的数据添加一个名为activation_status 的新键。

生成的hsh2 如下:

hsh2 = [{ "host"=>"devicename3", "secure"=>true,  "activation_status"=>"passive" },
        { "host"=>"devicename2", "secure"=>true,  "activation_status"=>"passive" },
        { "host"=>"devicename1", "secure"=>false, "activation_status"=>"active"  }]

这可能已经在 StackOverflow 上得到了回答,但我找了一段时间,找不到匹配项。如果这是重复的,我提前道歉。

【问题讨论】:

  • “大”是什么意思?只是粗略。 1000? 100万? 1000000000?
  • 好问题,我考虑过限定它。用 Ruby 术语来说,我敢打赌它没有那么大。不到 10,000 个。
  • 好的,那么一次全部保存在内存中应该没有问题。
  • 我希望你不介意我编辑你的问题。我只是重新格式化以避免读者需要水平滚动。
  • 谢谢卡里——一点也不 :)

标签: ruby


【解决方案1】:

我的建议是:

hash3 = hash2.map do |nestling|
  host = nestling["host"]
  status = hash1[host]
  nestling["activation_status"] = status
  nestling
end

当然可以缩小一点。此版本使用较少的变量和hash2 的就地编辑:

hash2.each do |nestling|
  nestling["activation_status"] = hash1[nestling["host"]]
end

【讨论】:

  • 明天我会将其中一个答案标记为正确的,我很生气,当我能想清楚的时候需要复习一下。两者似乎都适用于示例数据,所以我需要弄清楚它们的不同之处以及哪个更像是“Ruby Way”。非常感谢!
【解决方案2】:

这样就可以了:

hsh2.map { |h| h.merge 'activation_status' => hsh1[h['host']] }

但是,我认为它会复制数据,而不是仅仅遍历散列数组并添加适当的 key=>value 对。我认为它不会对性能产生巨大影响,除非您的数据集大到足以消耗分配给您的应用的大部分内存。

【讨论】:

  • Fred,你的解决方案将被标记为正确的,无论其他人有什么意义——因为你的个人资料照片很棒。我是 11 个月前的父亲,那张照片让我很开心 :-) 当然是开玩笑,让我们看看其他人的想法。提前谢谢你——这非常简洁。
  • 恭喜 - 做爸爸是最好的!
  • 我建议您将密钥从:activation_status 更改为"activation_status" 以匹配预期结果。我还建议使用map x 或修改现有数组的元素(然后使用each)。
  • 对索引的良好调用 - OP 确实为结果哈希指定了一个字符串键
  • 我明天将其中一个答案标记为正确,我很生气,当我能想清楚的时候需要复习一下。两者似乎都适用于示例数据,所以我需要弄清楚它们有何不同,哪一种更像是“Ruby Way”。非常感谢!
猜你喜欢
  • 2017-12-18
  • 2014-09-14
  • 2016-01-06
  • 2021-12-11
  • 1970-01-01
  • 2016-06-30
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多