Entschuldigung, ich habe über Hashes gesprochen :)
Claudio Acciaresi
Antworten:
232
Wenn Sie zwei Hashes haben, optionsund defaults, und Sie zusammenführen möchten defaultsin optionsohne vorhandene Schlüssel überschreiben, was Sie wirklich wollen , zu tun , ist das Gegenteil: merge optionsin defaults:
options = defaults.merge(options)
Wenn Sie Rails verwenden, können Sie Folgendes tun:
In der Standard-Ruby-Bibliothek gibt es eine Möglichkeit, Hashes zusammenzuführen, ohne vorhandene Werte zu überschreiben oder den Hash neu zuzuweisen.
important_hash.merge!(defaults){|key, important, default| important }
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:
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.
Wie wäre es, wenn Sie nicht beide Schlüssel behalten, sondern die Werte desselben Schlüssels addieren?
Tom KC Chiu
1
@ TomK.C.Chiu Das würde sehr stark von Umständen abhängen, die wir anhand der Frage nicht beurteilen können - was ist, wenn die Werte in Hash1 Zeichenfolgen und Hash2 Ganzzahlen sind? In einigen Fällen ist dies möglicherweise eine praktikable Option, die jedoch häufiger zu Problemen führt. Der Vorschlag, Listen für Werte zu verwenden, umgeht dies recht sauber.
Glenatron
0
Hier können Sie Ihre 2 Hashs zusammenführen 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}
Wenn Sie die beiden Hashes zusammenführen möchten optionsund defaultsohne Überschreiben der Ziel Hash, können Sie mit überprüfen , selectob der Schlüssel bereits in der Ziel - Hash. Hier ist die reine Ruby-Lösung ohne Rails:
Antworten:
Wenn Sie zwei Hashes haben,
options
unddefaults
, und Sie zusammenführen möchtendefaults
inoptions
ohne vorhandene Schlüssel überschreiben, was Sie wirklich wollen , zu tun , ist das Gegenteil: mergeoptions
indefaults
:Wenn Sie Rails verwenden, können Sie Folgendes tun:
quelle
reverse_merge!
aufgrund von Sicherheitsproblemen in Schienen 5.1In der Standard-Ruby-Bibliothek gibt es eine Möglichkeit, Hashes zusammenzuführen, ohne vorhandene Werte zu überschreiben oder den Hash neu zuzuweisen.
quelle
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:
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.
quelle
Hier können Sie Ihre 2 Hashs zusammenführen
reverse_merge
quelle
Wenn Sie die beiden Hashes zusammenführen möchten
options
unddefaults
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:Oder wenn der Schlüssel vorhanden ist, aber enthält
nil
und Sie ihn überschreiben möchten:quelle