我有一系列哈希:
arr = [
{:key1=>"foo one bar", :key2=>"two", :key3=>"three"},
{:key1=>"four", :key2=>"five", :key3=>"six"},
{:key1=>"seven", :key2=>"eight", :key3=>"nine"}
]
如果:key1
包含“一个”,我想搜索并将"replaced"
的值替换为:key
。
结果数组将显示为:
arr = [
{:key1=>"replaced", ;key2=>"two", :key3=>"three"},
{:key1=>"four", ;key2=>"five", :key3=>"six"},
{:key1=>"seven", ;key2=>"eight", :key3=>"nine"}
]
我尝试使用上一篇文章中的include?
并回复“Replace one matched value in a hash with another”,但无济于事。
这些将获得完全匹配:
arr.each{|item| item[:key1] = "replaced" if item[:key1]=="one"}
将会:
p arr.each {|x| x[:key1] = "replaced" if x.values_at(:key1) == "one"}
但是我只需要包含字符串术语。
答案 0 :(得分: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"}]
答案 1 :(得分:2)
您可以使用=~
在字符串中查找包含单词one
的模式,例如:
arr.each{|item| item[:key1] = "replaced" if item[:key1] =~ /one/ }
答案 2 :(得分: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
需要一个返回值,否则它会在迭代中返回该位置的nil。三元语句非常适合这种情况。保持Ruby中的三元语句看起来比使用像Perl这样的语言更难,我认为这是很多人避免它们的一个重要原因。我们可以使用尾随运算符格式化三元组,这有助于我们将语句分成不同的行,从而提高可读性。