Ruby 合并特定值上的两个哈希
我正在检查下面的哈希Ruby 合并特定值上的两个哈希,ruby,Ruby,我正在检查下面的哈希hash\u卷是否有一个其instance\u id与哈希hash\u instance的键匹配的键 hash_volumes = { :"vol-d16d12b8" => { :instance_id => "i-4e4ba679", }, } hash_instance = { :"i-4e4ba679" => { :arch => "x86_64", }, } 如果是,那么我需要将其合并到
hash\u卷
是否有一个其instance\u id
与哈希hash\u instance
的键匹配的键
hash_volumes = {
:"vol-d16d12b8" => {
:instance_id => "i-4e4ba679",
},
}
hash_instance = {
:"i-4e4ba679" => {
:arch => "x86_64",
},
}
如果是,那么我需要将其合并到hash\u实例
。我发现vol-d16d12b8
与实例I-4e4ba679
匹配,因此我想将其与hash_实例
合并,以便最终的hash_实例
如下所示:
hash_instance = {
:"i-4e4ba679" => {
:arch => "x86_64",
:volume => "vol-d16d12b8" # this is new entry to `hash_instance`
},
}
如上所述,我无法合并这两个哈希。如果语句有误,我怀疑我的。请看下面我的代码:
hash_volumes.each_key do |x|
hash_instance.each_key do |y|
if hash_volumes[x][:instance_id] == y ## I think this line is the problem
hash_instance[y][:volume] = x
end
end
end
hash_instance
输出:
{
:"i-4e4ba679" => {
:arch => "x86_64"
}
}
上面的代码给出了hash_实例
,而没有向其添加volume
。我尝试了以下方法,但均无效:
if hash_volumes[x][:instance_id] == "#{y}"
# => this if statement gives me syntax error
一个简单的实现是:
hash_instance.each do |k1, v1|
next unless k = hash_volumes.find{|k2, v2| v2[:instance_id].to_sym == k1}
v1[:volume] = k.first
end
一个简单的实现是:
hash_instance.each do |k1, v1|
next unless k = hash_volumes.find{|k2, v2| v2[:instance_id].to_sym == k1}
v1[:volume] = k.first
end
@萨瓦,谢谢你指出这一点。我已经编辑了代码。我总是在准备测试代码发布到SO.Good时输入错误。现在我将删除重复以使您的问题简洁。您需要将字符串转换为符号或将符号转换为strings@sawa,谢谢你指出。我已经编辑了代码。我总是在准备测试代码发布到SO.Good时输入错误。现在我将删除重复,使您的问题简洁明了。您需要根据我的需要将字符串转换为符号或符号转换为字符串。谢谢。@slayedbylucifer,find()每次都必须搜索这些键。执行一次散列查找,例如调用include?()/has_key?()比搜索键更有效。此外,我会避免使用,除非不惜一切代价——这是一种令人憎恶的行为。最后,“紧凑”通常意味着“很难阅读”,当然并不意味着更高效,因此不应该被模仿。这正是我所需要的。谢谢。@slayedbylucifer,find()每次都必须搜索这些键。执行一次散列查找,例如调用include?()/has_key?()比搜索键更有效。此外,我会避免使用,除非不惜一切代价——这是一种令人憎恶的行为。最后,“紧凑”通常意味着“很难阅读”,当然也不意味着更高效,因此不应该被模仿。谢谢。这是一个简洁紧凑的解决方案……而且很多都不起作用。如果v2没有这样的键,v2[:instance_id]将返回nil,然后nil.to_sym将抛出一个错误。如果散列卷可以有如下项::googly=>{:hello=>“再见”}
,则需要更改该解决方案。@7stud我假设:instance\u id
始终作为常规格式存在。这是我的解释,谢谢。这是一个简洁紧凑的解决方案……而且很多都不起作用。如果v2没有这样的键,v2[:instance_id]将返回nil,然后nil.to_sym将抛出一个错误。如果散列卷可以有如下项::googly=>{:hello=>“再见”}
,则需要更改该解决方案。@7stud我假设:instance\u id
始终作为常规格式存在。这就是我的解释。
hash_instance.each do |k1, v1|
next unless k = hash_volumes.find{|k2, v2| v2[:instance_id].to_sym == k1}
v1[:volume] = k.first
end