Ruby-基于匹配值合并两个没有相似键的哈希

Ruby-基于匹配值合并两个没有相似键的哈希,ruby,Ruby,我想找到一种有效的方法将两个散列合并在一起,得到的散列必须包含所有原始数据和基于以下条件的新的键/值对。两个哈希之间没有共同的键,但是一个哈希中的键与相邻哈希中的键的值匹配 还要注意,第二个散列实际上是一个散列数组 我正在处理一个相对较大的数据集,因此正在寻找一个有效的解决方案,但希望同时保持代码的可读性,因为它可能最终会投入生产 以下是我的数据结构: # Hash hsh1 = { "devicename1"=>"active", "devicename2"=>"passive",

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

还要注意,第二个散列实际上是一个散列数组

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

以下是我的数据结构:

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

# Array of Hashes
hsh2 = [ { "host" => "devicename3", "secure" => true  },
         { "host" => "devicename2", "secure" => true  },
         { "host" => "devicename1", "secure" => false } ]
以下是我需要完成的任务:

# 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\u 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上得到了回答,但我查找了一段时间,没有找到匹配项。如果这是重复的,我提前表示歉意。

这样就可以了:

hsh2.map { |h| h.merge 'activation_status' => hsh1[h['host']] }
但是,我认为它将创建数据的副本,而不是遍历散列数组并添加适当的key=>value对。我不认为这会对性能产生巨大影响,除非您的数据集足够大,足以消耗分配给应用程序的大部分内存。

这样可以:

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

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

我建议如下:

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

我的建议大致如下:

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


你说的“大”是什么意思?粗略地说。1000? 1000000? 1000000000?好问题,我考虑过限定它。用Ruby术语来说,我敢打赌它没有那么大。就差10000了。好吧,那么把这些都记在记忆里应该没问题。我希望你不介意我编辑你的问题。我只是重新格式化,以避免读者需要水平滚动。谢谢Cary——一点也不:)你说的“大”是什么意思?粗略地说。1000? 1000000? 1000000000?好问题,我考虑过限定它。用Ruby术语来说,我敢打赌它没有那么大。就差10000了。好吧,那么把这些都记在记忆里应该没问题。我希望你不介意我编辑你的问题。我只是简单地重新设置了格式,以避免读者需要水平滚动。谢谢Cary——一点也不:)Fred,你的解决方案将被标记为正确的,无论其他人如何理解——因为你的精彩个人资料图片。11个月前我还是一个爸爸,这张照片让我很高兴:-)开玩笑吧,当然,让我们看看其他人有什么想法。提前谢谢你——这很简洁。祝贺你——做爸爸是最好的!我建议您将密钥从
:activation\u status
更改为
“activation\u status”
,以匹配预期结果。我还建议使用
map
xor修改现有数组的元素(然后使用
each
)。对索引的调用很好-OP确实为结果指定了一个字符串键,Hash明天将标记一个正确的答案,我很激动,需要在我能思考清楚的时候回顾一下。这两种方法似乎都适用于示例数据,因此我需要找出它们之间的区别,以及哪一种更适合“Ruby方式”。非常感谢!弗雷德,你的解决方案将被标记为正确的一个,不管其他人如何理解——因为你的精彩个人资料图片。11个月前我还是一个爸爸,这张照片让我很高兴:-)开玩笑吧,当然,让我们看看其他人有什么想法。提前谢谢你——这很简洁。祝贺你——做爸爸是最好的!我建议您将密钥从
:activation\u status
更改为
“activation\u status”
,以匹配预期结果。我还建议使用
map
xor修改现有数组的元素(然后使用
each
)。对索引的调用很好-OP确实为结果指定了一个字符串键,Hash明天将标记一个正确的答案,我很激动,需要在我能思考清楚的时候回顾一下。这两种方法似乎都适用于示例数据,因此我需要找出它们之间的区别,以及哪一种更适合“Ruby方式”。非常感谢!明天我会在其中一个答案上做个正确的标记,我很激动,需要在我能思考清楚的时候复习一下。这两种方法似乎都适用于示例数据,因此我需要找出它们之间的区别,以及哪一种更适合“Ruby方式”。非常感谢!明天我会在其中一个答案上做个正确的标记,我很激动,需要在我能思考清楚的时候复习一下。这两种方法似乎都适用于示例数据,因此我需要找出它们之间的区别,以及哪一种更适合“Ruby方式”。非常感谢!