Se você possui dois hashes optionse defaultsdeseja unir defaults-se optionssem substituir as chaves existentes, o que realmente deseja fazer é o inverso: unir options- se a defaults:
Se o seu problema é que o hash original e o segundo podem ter chaves duplicadas e você não deseja sobrescrever em nenhuma direção, pode ser necessário fazer uma mesclagem manual simples com algum tipo de verificação e manuseio de colisão:
Obviamente, isso é muito rudimentar e supõe que o hash1 não possui nenhuma chave chamada "hash2-originou-seja o que for" - é melhor adicionar um número à chave para que ela se torne key1, key2 etc. um que ainda não esteja no hash1. Além disso, há alguns meses que não faço ruby, então isso provavelmente não está sintaticamente correto, mas você deve ser capaz de entender.
Como alternativa, redefina o valor da chave como uma matriz para que o hash1 [chave] retorne o valor original do hash1 e o valor do hash2. Depende do que você quer que seu resultado seja realmente.
Que tal se não manter as duas chaves, mas somar os valores da mesma chave?
Tom KC Chiu
1
@ TomK.C.Chiu Isso dependeria muito das circunstâncias que não podemos julgar a partir da pergunta - e se os valores no hash1 forem seqüências de caracteres e hash2 forem inteiros? Em alguns casos, isso pode ser uma opção viável, mas com mais freqüência isso causaria problemas - a sugestão de usar listas para valores funciona de maneira bastante clara.
glenatron
0
Aqui você pode mesclar seu hash 2 por reverse_merge
order ={
id:33987,
platform:'web'}
user ={
name:'Jhon Doe',
email:'[email protected]'}
newHash = oder.reverse_merge!(user)
render json:{ data: newHash, status:200}
Se você deseja mesclar os dois hashes optionse defaultssem substituir o hash de destino, verifique selectse a chave já está presente no hash de destino. Aqui está a solução Ruby pura sem Rails:
Respostas:
Se você possui dois hashes
options
edefaults
deseja unirdefaults
-seoptions
sem substituir as chaves existentes, o que realmente deseja fazer é o inverso: uniroptions
- se adefaults
:Ou, se você estiver usando o Rails, poderá:
fonte
reverse_merge!
por questões de segurança em trilhos 5.1Existe uma maneira na biblioteca Ruby padrão de mesclar Hashes sem substituir os valores existentes ou reatribuir o hash.
fonte
Se o seu problema é que o hash original e o segundo podem ter chaves duplicadas e você não deseja sobrescrever em nenhuma direção, pode ser necessário fazer uma mesclagem manual simples com algum tipo de verificação e manuseio de colisão:
Obviamente, isso é muito rudimentar e supõe que o hash1 não possui nenhuma chave chamada "hash2-originou-seja o que for" - é melhor adicionar um número à chave para que ela se torne key1, key2 etc. um que ainda não esteja no hash1. Além disso, há alguns meses que não faço ruby, então isso provavelmente não está sintaticamente correto, mas você deve ser capaz de entender.
Como alternativa, redefina o valor da chave como uma matriz para que o hash1 [chave] retorne o valor original do hash1 e o valor do hash2. Depende do que você quer que seu resultado seja realmente.
fonte
Aqui você pode mesclar seu hash 2 por
reverse_merge
fonte
Se você deseja mesclar os dois hashes
options
edefaults
sem substituir o hash de destino, verifiqueselect
se a chave já está presente no hash de destino. Aqui está a solução Ruby pura sem Rails:Ou, se a chave estiver presente, mas contiver
nil
e você quiser substituí-la:fonte