2016-07-19 6 views
0

Ich habe vor kurzem eine ähnliche Frage gestellt, dass ich here gelöst habe, aber ich muss es erneut fragen, weil meine Plattform unnachgiebig ist und die Struktur muss sein folgt:Ruby: Hinzufügen von Arrays von Hashes (nicht fragen), löschen, wenn gefunden

"variables": [ 
    { 
    "box": "info_top", 
    "content": "Default info_top content" 
    }, 
    { 
    "box": "info_bottom", 
    "content": "Default info_bottom content" 
    }, 
    { 
    "box": "info_top", 
    "content": "NEW INFO TOP CONTENT" 
    } 
] 

kurz gesagt, den ersten I info_top Hash in der obigen Anordnung mit den zweiten info_top überschrieben werden soll. Die Methode, die dieses Array baut sieht wie folgt aus:

def variables 
    (template_variables + user_variables).sort_by do |k, _v| 
    order.index k['box'].to_sym 
    end 
end 

ich user_variables brauchen jede Hash in template_variables basierend auf dem Hash der Wert des box Schlüssel gefunden zu ersetzen.

Antwort

2

Wenn Ihre Arrays wie folgt aussehen:

template_variables = [ 
    { 
    "box" => "info_top", 
    "content" => "Default info_top content" 
    }, 
    { 
    "box" => "info_bottom", 
    "content" => "Default info_bottom content" 
    } 
] 

user_variables = [ 
    { 
    "box" => "info_top", 
    "content" => "NEW INFO TOP CONTENT" 
    } 
] 

Sie können es wie diese:

(user_variables + template_variables).uniq { |hash| hash["box"] } 

=> [{"box"=>"info_top", "content"=>"NEW INFO TOP CONTENT"}, {"box"=>"info_bottom", "content"=>"Default info_bottom content"}] 

Beachten Sie, dass erste user_varliables geht, wenn die Arrays zusammen addieren.

EDIT:

So ist die endgültige Version sollte wie folgt aussehen:

def variables 
    (user_variables + template_variables).uniq { |hash| hash["box"] }.sort_by do |k, _v| 
    order.index k['box'].to_sym 
    end 
end 
+0

@ CD-RUM - siehe bearbeiten. – seph

1
variables.each_with_object([]) do |h, memo| 
    if elem = memo.detect { |e| e['box'] == h['box'] } 
    elem['content'] = h['content'] # we already have it ⇒ update 
    else 
    memo << h # new item ⇒ just insert 
    end 
end 

#⇒ [ 
# [0] { 
#   "box" => "info_top", 
#  "content" => "NEW INFO TOP CONTENT" 
# }, 
# [1] { 
#   "box" => "info_bottom", 
#  "content" => "Default info_bottom content" 
# } 
# ] 
+0

Diese nur Fehler zurückgibt. Was sollte "Elem" sein? –

+0

Welche Fehler gibt es zurück? Ich habe nicht die Frage bekommen, was "elem" sein soll, "elem" ist eine lokale Variable, die hier in der zweiten Zeile definiert ist. BTW, auf die Eingabe, die Sie beide Antworten hier zur Verfügung gestellt haben, funktionieren ganz gut. Es wäre großartig, wenn Sie versuchen würden, das Problem in der Problembeschreibung zu finden, es zu beheben und dann mit den Behauptungen "das funktioniert nicht" zurückzukehren, weil das funktioniert. – mudasobwa

+0

Mein Fehler, mein Linter hat dein '=' in ein Doppel '==' geändert. –