2013-04-20 36 views
1

我有散列數組:如何替換哈希中包含的值?

arr = [ 
    {:key1=>"foo one bar", :key2=>"two", :key3=>"three"}, 
    {:key1=>"four", :key2=>"five", :key3=>"six"}, 
    {:key1=>"seven", :key2=>"eight", :key3=>"nine"} 
] 

和我想通過搜索和與"replaced"取代的:key1的值,如果:key CONTAINS「一」。

得到的數組將然後閱讀:

arr = [ 
    {:key1=>"replaced", ;key2=>"two", :key3=>"three"}, 
    {:key1=>"four", ;key2=>"five", :key3=>"six"}, 
    {:key1=>"seven", ;key2=>"eight", :key3=>"nine"} 
] 

我試着在「Replace one matched value in a hash with another」,但無濟於事使用include?從我以前的帖子和回覆。

這些都將得到一個確切的比賽:

arr.each{|item| item[:key1] = "replaced" if item[:key1]=="one"} 

的意志:

p arr.each {|x| x[:key1] = "replaced" if x.values_at(:key1) == "one"} 

,但我需要它只是包含字符串項。

+0

包含字符串「one」的其他單詞是否可以存在? – 2013-04-21 16:19:34

回答

3
arr = [ 
    {:key1=>"foo one bar", :key2=>"two", :key3=>"three"}, 
    {:key1=>"four", :key2=>"five", :key3=>"six"}, 
    {:key1=>"seven", :key2=>"eight", :key3=>"nine"} 
] 

arr.each {|x| x[:key1] = 'replaced' if x[:key1].include? 'one'} 
p arr 

輸出:

[{:key1=>"replaced", :key2=>"two", :key3=>"three"}, {:key1=>"four", :key2=>"five", :key3=>"six"}, {:key1=>"seven", :key2=>"eight", :key3=>"nine"}] 
+0

非常好。非常感謝! – 2013-04-20 16:14:50

+0

@NickWild歡迎您,享受:) – 2013-04-20 16:15:13

+0

你不需要使用地圖方法,每種方法都將是足夠的 – megas 2013-04-21 01:10:17

2

您可以使用=~尋找包含字符串中的字one的模式,例如:

arr.each{|item| item[:key1] = "replaced" if item[:key1] =~ /one/ } 
+0

非常感謝您的快速回答。 – 2013-04-20 16:15:07

+0

@NickWild沒問題。 – fmendez 2013-04-20 16:16:25

2

一對夫婦技巧可以幫助創建緊湊但可以理解的代碼。與開始:

arr = [ 
    {:key1=>"foo one bar", :key2=>"two", :key3=>"three"}, 
    {:key1=>"four",  :key2=>"five", :key3=>"six"}, 
    {:key1=>"seven",  :key2=>"eight", :key3=>"nine"} 
] 

我可以使用:

arr.map!{ |h| 
    h[:key1][/\b one \b/x] ? 
    h.merge(:key1 => 'replaced') : 
    h 
} 

其中,運行後,看起來像:

[ 
    [0] { 
     :key1 => "replaced", 
     :key2 => "two", 
     :key3 => "three" 
    }, 
    [1] { 
     :key1 => "four", 
     :key2 => "five", 
     :key3 => "six" 
    }, 
    [2] { 
     :key1 => "seven", 
     :key2 => "eight", 
     :key3 => "nine" 
    } 
] 

map!,像map,需要一個返回值,否則它會返回迭代中該位置無效。一個三元語句恰好適合這一點。在Ruby中保持三元語句看起來不錯比Perl這樣的語言更困難,我認爲這是許多人避免它們的一個重要原因。我們可以使用尾隨運算符來設置三元組的格式,這有助於我們將語句分解成單獨的行,從而提高可讀性。

+0

非常感謝這個提示。對於像我這樣的noob非常有用 – 2013-04-22 17:29:31

+0

目標是教你如何做東西,以便幫助新人學習。 – 2013-04-22 18:22:07