Yinelenen anahtarların üzerine yazmadan iki karmayı birleştirmenin kolay veya zarif bir yolu var mı ?
Yani, anahtar orijinal karmada varsa, değerini değiştirmek istemiyorum.
Yinelenen anahtarların üzerine yazmadan iki karmayı birleştirmenin kolay veya zarif bir yolu var mı ?
Yani, anahtar orijinal karmada varsa, değerini değiştirmek istemiyorum.
Yanıtlar:
İki karmaları var ise optionsve defaultsve Birleştirmek istediğiniz defaultsiçine optionsbirleştirme: Mevcut anahtarları üzerine yazmadan, ne gerçekten yapmak istiyorum tersidir optionsiçine defaults:
options = defaults.merge(options)
Veya Rails kullanıyorsanız şunları yapabilirsiniz:
options.reverse_merge!(defaults)
reverse_merge!5.1
Sorunlarınız orijinal karmanın ve ikincisinin her ikisinin de yinelenen anahtarları olması ve her iki yönde de üzerine yazmak istemiyorsanız, bir tür çarpışma kontrolü ve kullanımı ile basit bir manuel birleştirme için gitmeniz gerekebilir:
hash2.each_key do |key|
if ( hash1.has_key?(key) )
hash1[ "hash2-originated-#{key}" ] = hash2[key]
else
hash1[key]=hash2[key]
end
end
Açıkçası, bu çok ilkeldir ve hash1'in "hash2 kaynaklı-ne olursa olsun" adı verilen herhangi bir anahtarı olmadığını varsayar - tuşa bir sayı eklemeniz daha iyi olabilir, bu yüzden tuşa basana kadar tuş1, tuş2 vb. hash1'de olmayan bir tane. Ayrıca, birkaç aydır hiç yakut yapmadım, bu muhtemelen sözdizimsel olarak doğru değil, ama özü elde edebilmelisin.
Alternatif olarak, anahtarın değerini bir dizi olarak yeniden tanımlayın, böylece hash1 [key], hash1'den orijinal değeri ve hash2'den değeri döndürür. Sonucunuzun gerçekten olmasını istediğiniz şeye bağlıdır.
Burada 2 karma değerini birleştirerek 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 }
İki karmaları birleştirmek istiyorsanız optionsve defaultshedef karma üzerine yazmadan, sen kontrol edebilir selectanahtar zaten hedef karma bulunup bulunmadığının. Rails olmadan saf Ruby çözümü:
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}
Veya anahtar varsa, ancak içeriyorsa nilve üzerine yazmak istiyorsanız:
options.merge!(defaults.select{ |k,_| options[k].nil? })