2016-05-24 8 views
0

Wenn ich ein Array von HashesPassing sort_by eine Reihe von Sortierfeldern

collection = [ 
    { first_name: 'john', last_name: 'smith', middle: 'c'}, 
    { first_name: 'john', last_name: 'foo', middle: 'a'} 
] 

und eine Reihe von Tasten habe ich sortieren mag:

sort_keys = ['first_name', 'last_name'] 

Wie kann ich diesen Schlüssel sort_by passieren vorausgesetzt, dass die Schlüssel immer den Schlüsseln in der Sammlung entsprechen?

Ich habe

versucht
collection.sort_by { |v| sort_keys.map(&:v) } 

aber das funktioniert nicht. Ich glaube, ich muss einen Proc verwenden, aber ich bin mir nicht sicher, wie ich ihn implementieren soll. Würde mich über jede Hilfe freuen!

mit Ruby 2.2.1

Antwort

5

Wenn Sie Ihre sort_keys ändern Symbole enthalten:

sort_keys = [:first_name, :last_name] 

Sie values_at die Werte abrufen können:

collection.sort_by { |h| h.values_at(*sort_keys) } 
#=> [{:first_name=>"john", :last_name=>"foo", :middle=>"a"}, {:first_name=>"john", :last_name=>"smith", :middle=>"c"}] 

Das Array, das verwendet wird, So sortieren Sie die Hashes sieht so aus:

collection.map { |h| h.values_at(*sort_keys) } 
#=> [["john", "smith"], ["john", "foo"]] 
+0

Das funktioniert, danke !! Was macht 'values_at' hinter den Kulissen? Es funktioniert ohne Umwandlung der Schlüssel in Symbole, glaube ich, weil es gleichgültig Zugang ist. – theartofbeing

+1

Nein, er hat die Schlüssel in den 'sort_keys' Arrays zu Symbolen gemacht. Es gibt keinen gleichgültigen Zugriff auf einen einfachen Ruby-Hash. –