2016-07-29 5 views
-1

Was ich versuche zu tun ist eine Liste von Spalten zu geben, erhalten Sie eine Reihe von Spaltenformaten. Ich habe ein Array von Spaltennamen, und a hat, wo der Schlüssel der Spaltenname ist und der Wert das Format ist, das die Spalte benötigt. Wenn im Hash für eine bestimmte Spalte kein Wert vorhanden ist, muss sie im resultierenden Array nicht vorhanden sein.Wie kann ich ein Array mit einem Hash übersetzen?

report_columns = ["val1", "val2", "subtotal", 
        "othertotal", "grand_total", "moar_total"] 
    column_formats = {"grand_total" => @highlight_money, 
        "subtotal" => @money} 

ich tun kann es leicht mit diesem Code:

Gegeben

datatype_array = [] 
    report_columns.each {|col| datatype_array << column_formats[col] } 
    # do stuff with datatype_array 

Aber das ist Rubin. Es gibt einen prägnanteren Weg, dies zu tun! Bitte lassen Sie mich wissen, welche magische Methode mir fehlt.

Antwort

2

Ihr erster Versuch sollte eine einfache map anstatt eine each sein, die sich auf einem Array ansammelt.

datatype_array = report_columns.map { |c| column_formats[c] } 

Sie können auch die Anordnung von Spalten in Hash#values_at zu, die mehrere Schlüsselnamen als einzelne Argumente erwartet:

datatype_array = column_formats.values_at(*report_columns) 
+0

Ich sehe Raum nicht für eine Verbesserung oder sogar eine enge Sekunde. –

+0

FWIW Ruby 2.3 hat 'Hash # to_proc', also können Sie' report_columns.map (& column_formats) 'machen. –

+0

Und ohne 'Hash # to_proc' können Sie 'report_columns.map (& column_formats.method (: [])) '' tun –

Verwandte Themen