Gibt es eine einfache oder elegante Möglichkeit, zwei Hashes zusammenzuführen, ohne doppelte Schlüssel zu überschreiben?
Das heißt, wenn der Schlüssel im ursprünglichen Hash vorhanden ist, möchte ich seinen Wert nicht ändern.
Gibt es eine einfache oder elegante Möglichkeit, zwei Hashes zusammenzuführen, ohne doppelte Schlüssel zu überschreiben?
Das heißt, wenn der Schlüssel im ursprünglichen Hash vorhanden ist, möchte ich seinen Wert nicht ändern.
Antworten:
Wenn Sie zwei Hashes haben, options
und defaults
, und Sie zusammenführen möchten defaults
in options
ohne vorhandene Schlüssel überschreiben, was Sie wirklich wollen , zu tun , ist das Gegenteil: merge options
in defaults
:
options = defaults.merge(options)
Wenn Sie Rails verwenden, können Sie Folgendes tun:
options.reverse_merge!(defaults)
reverse_merge!
aufgrund von Sicherheitsproblemen in Schienen 5.1
Wenn Ihr Problem darin besteht, dass der ursprüngliche Hash und der zweite Hash möglicherweise doppelte Schlüssel haben und Sie nicht in beide Richtungen überschreiben möchten, müssen Sie möglicherweise eine einfache manuelle Zusammenführung mit einer Art Kollisionsprüfung und -behandlung durchführen:
hash2.each_key do |key|
if ( hash1.has_key?(key) )
hash1[ "hash2-originated-#{key}" ] = hash2[key]
else
hash1[key]=hash2[key]
end
end
Dies ist natürlich sehr rudimentär und setzt voraus, dass Hash1 keine Schlüssel mit der Bezeichnung "Hash2-Originated-Whatever" hat. Möglicherweise ist es besser, nur eine Nummer zum Schlüssel hinzuzufügen, damit er zu Key1, Key2 usw. wird, bis Sie auf drücken eine, die noch nicht in hash1 enthalten ist. Außerdem habe ich seit einigen Monaten keinen Rubin mehr gemacht, daher ist das wahrscheinlich nicht syntaktisch korrekt, aber Sie sollten in der Lage sein, das Wesentliche zu verstehen.
Alternativ können Sie den Wert des Schlüssels als Array neu definieren, sodass Hash1 [Schlüssel] den ursprünglichen Wert von Hash1 und den Wert von Hash2 zurückgibt. Kommt darauf an, was dein Ergebnis wirklich sein soll.
Hier können Sie Ihre 2 Hashs zusammenführen 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 }
Wenn Sie die beiden Hashes zusammenführen möchten options
und defaults
ohne Überschreiben der Ziel Hash, können Sie mit überprüfen , select
ob der Schlüssel bereits in der Ziel - Hash. Hier ist die reine Ruby-Lösung ohne 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}
Oder wenn der Schlüssel vorhanden ist, aber enthält nil
und Sie ihn überschreiben möchten:
options.merge!(defaults.select{ |k,_| options[k].nil? })