有没有一种简单或优雅的方法可以合并两个哈希表而不覆盖重复的键?
也就是说,如果原始哈希表中存在该键,我就不想改变它的值。
有没有一种简单或优雅的方法可以合并两个哈希表而不覆盖重复的键?
也就是说,如果原始哈希表中存在该键,我就不想改变它的值。
options
和defaults
,并且你想将defaults
合并到options
中而不覆盖现有键,则你真正想做的是相反的操作:将options
合并到defaults
中。options = defaults.merge(options)
或者,如果你正在使用Rails,你可以这样做:
options.reverse_merge!(defaults)
reverse_merge!
。 - Mirv - Matt在标准的Ruby库中有一种方法可以合并哈希,而不会覆盖现有的值或重新分配哈希。
important_hash.merge!(defaults) { |key, important, default| important }
hash2.each_key do |key|
if ( hash1.has_key?(key) )
hash1[ "hash2-originated-#{key}" ] = hash2[key]
else
hash1[key]=hash2[key]
end
end
reverse_merge
合并您的2个哈希。order = {
id: 33987,
platform: 'web'
}
user = {
name: 'Jhon Doe',
email: 'jhon.doe@gmail.com'
}
newHash = order.reverse_merge!(user)
render json: { data: newHash, status: 200 }
# => {:name=>"Jhon Doe", :email=>"jhon.doe@gmail.com", :id=>33987, :platform=>"web"}
{}
对 reverse_merge
和 reverse_merge!
都没有响应,而且你的代码似乎没有包含 ActiveSupport。 - undefinedoptions
和 defaults
合并而不覆盖目标哈希表,可以使用 select
检查目标哈希表中是否已经存在该键。以下是纯 Ruby 解决方案(不含 Rails):options = { "a" => 100, "b" => 200 }
defaults = { "b" => 254, "c" => 300 }
options.merge!(defaults.select{ |k,_| not options.has_key? k })
# output
# => {"a"=>100, "b"=>200, "c"=>300}
或者,如果键存在但包含nil
并且您想要覆盖它:
options.merge!(defaults.select{ |k,_| options[k].nil? })