如何将一个散列中的值复制到另一个散列中,但仅适用于存在于两个散列中的键?
最小的例子
h1 = {a: 10, b: 20, c: 30}
h2 = {a: nil, c: nil}
## desired result
{a: 10, c: 30}
我已经用"手动"方法解决了-即{a: h1[:a], c: h1[:c]}
-但它是冗长的,看起来更糟的键有。我肯定有更优雅的东西。
您可以这样做。
h1 = { a: 10, b: 20, c: 30 }
h2 = { a: nil, c: nil, d: nil }
h1.slice(*h2.keys)
#=> {:a=>10, :c=>30}
看到散列#片。
请注意,上面的例子与问题中的例子不同,因为我在h2
(:d
)中添加了h1
中不存在的键。
手册;带有循环的方法看起来像这样
h1.each do |k, v|
h2[k] = v if h2.include? k
end
如果您的目标是创建一个新的散列,而不是修改现有的散列,您可以使用filter
(在旧版本的Ruby中称为select
)
h1.filter { |k, v| h2.include? k }
或者,如果您想修改h1
,只使用k2
的密钥,您可以使用filter!
(在旧版本中称为select!
),它的工作原理与filter
类似,但可以就地修改。
h1.filter! { |k, v| h2.include? k }