Czy naprawdę masz na myśli tablice (np .: ['a', 'b', 'c']) czy hashe (np .: {'a' => 1, 'b' => 2, 'c' => 3}) ?
Alex Reisner
Przepraszam, mówiłem o
hashach
Odpowiedzi:
232
Jeśli masz dwa hashe, optionsi defaults, i chcesz połączyć defaultssię optionsbez nadpisywania istniejących kluczy, co naprawdę chcesz robić jest odwrotna: scalanie optionsw defaults:
Jeśli problem polega na tym, że oryginalny hash i drugi mogą mieć zduplikowane klucze i nie chcesz nadpisywać w żadnym kierunku, być może będziesz musiał przejść do prostego ręcznego scalania z pewnego rodzaju sprawdzaniem i obsługą kolizji:
Oczywiście jest to bardzo elementarne i zakłada, że hash1 nie ma żadnych kluczy zwanych „hash2-originated-cokolwiek” - może być lepiej, jeśli dodasz numer do klawisza, aby stał się kluczem1, kluczem2 i tak dalej, dopóki nie naciśniesz taki, który nie jest jeszcze w hash1. Poza tym nie robiłem żadnego rubinu przez kilka miesięcy, więc prawdopodobnie nie jest to poprawne składniowo, ale powinieneś być w stanie zrozumieć sedno.
Alternatywnie ponownie zdefiniuj wartość klucza jako tablicę, tak aby hash1 [klucz] zwracał oryginalną wartość z hash1 i wartość z hash2. Zależy od tego, jaki naprawdę ma być wynik.
A jeśli nie zachowasz obu kluczy, ale zsumujesz wartości tego samego klucza?
Tom KC Chiu
1
@ TomK.C.Chiu To w dużej mierze zależałoby od okoliczności, których nie możemy ocenić na podstawie pytania - a co, jeśli wartości w hash1 są ciągami, a hash2 są liczbami całkowitymi? W niektórych przypadkach może to być opłacalna opcja, ale częściej powodowałaby problemy - sugestia użycia list dla wartości działa dość jasno.
glenatron
0
Tutaj możesz połączyć swoje 2 hash przez 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}
Jeśli chcesz scalić dwa skróty optionsi defaultsnie nadpisywać docelowego skrótu, możesz sprawdzić, selectczy klucz jest już obecny w docelowym skrócie. Oto czyste rozwiązanie Ruby bez Rails:
Odpowiedzi:
Jeśli masz dwa hashe,
options
idefaults
, i chcesz połączyćdefaults
sięoptions
bez nadpisywania istniejących kluczy, co naprawdę chcesz robić jest odwrotna: scalanieoptions
wdefaults
:Lub, jeśli używasz Railsów, możesz:
źródło
reverse_merge!
powodu problemów z bezpieczeństwem w szynach 5.1W standardowej bibliotece Ruby istnieje sposób na scalenie skrótów bez nadpisywania istniejących wartości lub ponownego przypisywania skrótu.
źródło
Jeśli problem polega na tym, że oryginalny hash i drugi mogą mieć zduplikowane klucze i nie chcesz nadpisywać w żadnym kierunku, być może będziesz musiał przejść do prostego ręcznego scalania z pewnego rodzaju sprawdzaniem i obsługą kolizji:
Oczywiście jest to bardzo elementarne i zakłada, że hash1 nie ma żadnych kluczy zwanych „hash2-originated-cokolwiek” - może być lepiej, jeśli dodasz numer do klawisza, aby stał się kluczem1, kluczem2 i tak dalej, dopóki nie naciśniesz taki, który nie jest jeszcze w hash1. Poza tym nie robiłem żadnego rubinu przez kilka miesięcy, więc prawdopodobnie nie jest to poprawne składniowo, ale powinieneś być w stanie zrozumieć sedno.
Alternatywnie ponownie zdefiniuj wartość klucza jako tablicę, tak aby hash1 [klucz] zwracał oryginalną wartość z hash1 i wartość z hash2. Zależy od tego, jaki naprawdę ma być wynik.
źródło
Tutaj możesz połączyć swoje 2 hash przez
reverse_merge
źródło
Jeśli chcesz scalić dwa skróty
options
idefaults
nie nadpisywać docelowego skrótu, możesz sprawdzić,select
czy klucz jest już obecny w docelowym skrócie. Oto czyste rozwiązanie Ruby bez Rails:Lub jeśli klucz jest obecny, ale zawiera
nil
i chcesz go nadpisać:źródło