2017-02-17 49 views
0

的陣列我有哈希以下數組和我想使用transform_keys使用正則表達式來剝離每個鍵的開頭:transform_keys用於散列

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"}] 

,我想以下:

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

我有以下的方法,但它會導致array_of_hashes代替transformed_hash_keys的:

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

有人能告訴我在這種方法中我做錯了什麼嗎?

回答

1

transform_keys不適用,each返回原始迭代器,而不是塊的結果。

你可以做你想要map而不是each什麼。

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

或者,你可以使用transform_keys!修改的array_of_hashes

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

謝謝!地圖將最適合我的目的 – Munchies

1

內容下面是一個純Ruby的解決方案。

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"}] 

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"}]