重複するキーを上書きせずに2つのハッシュをマージする簡単またはエレガントな方法はありますか?
つまり、キーが元のハッシュに存在する場合、その値を変更したくありません。
重複するキーを上書きせずに2つのハッシュをマージする簡単またはエレガントな方法はありますか?
つまり、キーが元のハッシュに存在する場合、その値を変更したくありません。
回答:
2つのハッシュとがoptions
ありdefaults
、既存のキーを上書きせずににマージdefaults
しoptions
たい場合、本当にやりたいのはその逆です:merge options
into defaults
:
options = defaults.merge(options)
または、Railsを使用している場合は、次のことができます。
options.reverse_merge!(defaults)
reverse_merge!
Rails 5.1のセキュリティの問題のため、非推奨になりました
元のハッシュと2番目のハッシュの両方に重複したキーがあり、どちらの方向にも上書きしたくないという問題がある場合は、なんらかの衝突チェックと処理を伴う単純な手動マージを行わなければならない場合があります。
hash2.each_key do |key|
if ( hash1.has_key?(key) )
hash1[ "hash2-originated-#{key}" ] = hash2[key]
else
hash1[key]=hash2[key]
end
end
明らかに、これは非常に初歩的なものであり、hash1には「hash2-originated-whatever」と呼ばれるキーがないことを前提としています。まだhash1に含まれていないもの。また、数か月間ルビーを実行していないので、おそらく構文的に正しくありませんが、要点を理解できるはずです。
または、キーの値を配列として再定義して、hash1 [key]がhash1からの元の値とhash2からの値を返すようにします。あなたがあなたの結果が本当になりたいものに依存します。
ここで2つのハッシュをマージできます reverse_merge
order = {
id: 33987,
platform: 'web'
}
user = {
name: 'Jhon Doe',
email: 'jhon.doe@gmail.com'
}
newHash = oder.reverse_merge!(user)
render json: { data: newHash, status: 200 }
あなたは2つのハッシュをマージしたい場合options
やdefaults
、宛先ハッシュを上書きせずに、あなたがチェックしてselect
キーが既に先のハッシュに存在している場合。Railsを使用しない純粋なRubyソリューションを次に示します。
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? })