Apakah ada yang mudah atau elegan untuk menggabungkan dua hash tanpa menimpa kunci duplikat?
Yaitu, jika kuncinya ada dalam hash asli saya tidak ingin mengubah nilainya.
Apakah ada yang mudah atau elegan untuk menggabungkan dua hash tanpa menimpa kunci duplikat?
Yaitu, jika kuncinya ada dalam hash asli saya tidak ingin mengubah nilainya.
Jawaban:
Jika Anda memiliki dua hash, optionsdan defaults, dan Anda ingin menggabungkan defaultske dalam optionstanpa Timpa kunci yang ada, apa yang Anda benar-benar ingin lakukan adalah kebalikan: merge optionske defaults:
options = defaults.merge(options)
Atau, jika Anda menggunakan Rails yang dapat Anda lakukan:
options.reverse_merge!(defaults)
reverse_merge!karena masalah keamanan di rel 5.1
Jika masalah Anda adalah bahwa hash asli dan yang kedua mungkin memiliki kunci duplikat dan Anda tidak ingin menimpa di kedua arah, Anda mungkin harus menggunakan penggabungan manual sederhana dengan semacam pemeriksaan dan penanganan tabrakan:
hash2.each_key do |key|
if ( hash1.has_key?(key) )
hash1[ "hash2-originated-#{key}" ] = hash2[key]
else
hash1[key]=hash2[key]
end
end
Jelas, ini sangat sederhana dan mengasumsikan bahwa hash1 tidak memiliki kunci yang disebut "hash2-originated-whatever" - Anda mungkin lebih baik hanya menambahkan angka pada kunci sehingga menjadi key1, key2 dan seterusnya sampai Anda menekan salah satu yang belum ada di hash1. Juga, saya belum melakukan ruby selama beberapa bulan sehingga mungkin secara sintaksis tidak benar, tetapi Anda harus bisa mendapatkan intinya.
Alternatifnya mendefinisikan kembali nilai kunci sebagai array sehingga hash1 [kunci] mengembalikan nilai asli dari hash1 dan nilai dari hash2. Tergantung apa yang Anda inginkan, hasil Anda sebenarnya.
Di sini Anda dapat menggabungkan 2 hash Anda dengan 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 }
Jika Anda ingin menggabungkan kedua hash optionsdan defaultstanpa menimpa hash tujuan, Anda dapat memeriksa selectapakah kunci sudah ada di hash tujuan. Inilah solusi Ruby murni tanpa 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}
Atau jika kunci ada, tetapi berisi nildan Anda ingin menimpanya:
options.merge!(defaults.select{ |k,_| options[k].nil? })