2016-06-01 11 views
0

Ich habe das folgende Array von HashesDuplikate entfernen Artikel von Hash

input = [ 
    {'line_number' => 1, 'name' => 'Name1', 'value' => 'Value'}, 
    {'line_number' => 1, 'name' => 'Name2', 'value' => 'Value'}, 
    {'line_number' => 2, 'name' => 'AnotherName', 'value' => 'AnotherValue'} 
] 

ich will, die nach dem zur Eindeutigkeit der Ausgang

output = [ 
    {'line_number' => 1, 'name' => 'Name2', 'value' => 'Value'}, 
    {'line_number' => 2, 'name' => 'AnotherName', 'value' => 'AnotherValue'} 
] 

sein würde, weil einfach Einzigartigkeit

input.uniq! { |i| i['line_number'] }
mich

geben
output = [ 
    {'line_number' => 1, 'name' => 'Name1', 'value' => 'Value'}, 
    {'line_number' => 2, 'name' => 'AnotherName', 'value' => 'AnotherValue'} 
] 

Vielen Dank im Voraus.

+1

Was ist Die Logik dahinter? Halte das letzte oder das größere Element für ''name''? – Stefan

Antwort

0

Sehr seltsame Frage, aber vielleicht, es kann Ihnen helfen:

input.group_by { |i| i['line_number'] }.values.map! { |i| i.last } 
+0

oder '.values.map (&: last)' – Stefan

+0

Ja, vielleicht ist die Frage ein bisschen seltsam. Vielen Dank auch, Ihre Lösung hilft mir auch. –

+2

@KhachaturSaribekyan hast du gesehen [meine obigen Kommentar] (http://stackoverflow.com/questions/37569312/remove-duplicates-items-from-ruby#comment62626255_37569312)? Es wäre hilfreich, wenn Sie Ihre Frage klären könnten. – Stefan

1

Wenn Sie das letzte halten möchten, können Sie dies tun

input.each_with_object({}) {|h, obj| obj[h['line_number']] = h}.values 
# => [{"line_number"=>1, "name"=>"Name2", "value"=>"Value"}, 
# => {"line_number"=>2, "name"=>"AnotherName", "value"=>"AnotherValue"}] 
+0

Danke Santhosh, das hat mir wirklich geholfen –

+0

Meine Präferenz, so weit. Betrachten Sie einen Hash-ähnlichen Namen als Ersatz für 'obj'. Letzteres hört sich an, als könnte es irgendein Objekt sein, aber wir wissen, dass es ein Hash ist. –

+0

Dank @CarySwoveland, beide Blockargumente sind Hashes, konnte nicht einen Namen zur Unterscheidung der beiden denken. – Santhosh

0

Wenn Sie das behalten wollen anstelle des ersten dauern, warum nicht einfach

input.reverse.uniq { |i| i['line_number'] } 
+1

Sie müssen am Ende ein weiteres "reverse" hinzufügen. – Stefan

+0

Ja, wenn die resultierende Reihenfolge wichtig ist. Das wurde nicht angegeben. –

0
input.each_with_object({}) { |g,h| h.update(g['line_number']=>g) }.values 
    #=> [{"line_number"=>1, "name"=>"Name2", "value"=>"Value"}, 
    # {"line_number"=>2, "name"=>"AnotherName", "value"=>"AnotherValue"}]