2017-02-17 4 views
0

Ich habe folgende Array von Hashes und ich möchte transform_keys verwenden, um den Beginn jeder Schlüssel Streifen eine regex:transform_keys für ein Array von Hashes

array_of_hashes = [{"a_0_abc"=>"1", 
    "a_0_def"=>"1", 
    "a_0_hij"=>"1",}, 
{"a_1_abc”=>"2", 
    "a_1_def"=>"2", 
    "a_1_hij"=>"2"}] 

und ich möchte folgendes:

transformed_hash_keys = [{"abc"=>"1", 
"def"=>"1", 
"hij"=>"1",}, 
{"abc"=>"2", 
"def"=>"2", 
"hij"=>"2"}] 

ich habe die folgende Methode, aber es führt zu array_of_hashes statt transformed_hash_keys:

def strip 
    s = array_of_hashes.each { |hash| hash.transform_keys { |key| key.sub(/^a_(\d+)_/, '') } } 
end 

Kann mir jemand sagen, was ich bei dieser Methode falsch mache?

Antwort

1

transform_keys funktioniert nicht an Ort und Stelle each gibt den ursprünglichen Iterator, nicht das Ergebnis des Blocks.

Sie könnten tun, was Sie wollen mit map anstelle von each.

def strip 
    s = array_of_hashes.map { |hash| hash.transform_keys { |key| key.sub(/^a_(\d+)_/, '') } } 
end 

Oder Sie transform_keys! nutzen könnten, den Inhalt array_of_hashes

def strip 
    s = array_of_hashes.each { |hash| hash.transform_keys! { |key| key.sub(/^a_(\d+)_/, '') } } 
end 
+0

Vielen Dank! Karte wird am besten für meine Zwecke funktionieren – Munchies

1

Hier ist eine reine Ruby-Lösung zu ändern.

arr = [{ "a_0_abc"=>"1", "a_0_def"=>"1", "a_0_hij"=>"1" }, 
     { "a_1_abc"=>"2", "a_1_def"=>"2", "a_1_hij"=>"2" }] 

arr.map { |h| h.map { |k,v| [k[/[[:alpha:]]+\z/], v] }.to_h } 
    #=> [{"abc"=>"1", "def"=>"1", "hij"=>"1"}, {"abc"=>"2", "def"=>"2", "hij"=>"2"}] 

oder

arr.map { |h| h.each_with_object({}) { |(k,v),g| g[k[/[[:alpha:]]+\z/]] = v } } 
    # => [{"abc"=>"1", "def"=>"1", "hij"=>"1"}, {"abc"=>"2", "def"=>"2", "hij"=>"2"}]