如何替换哈希中包含的值?

时间:2013-04-20 16:05:56

标签: ruby arrays hash

我有一系列哈希:

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

但是我只需要包含字符串术语。

3 个答案:

答案 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这样的语言更难,我认为这是很多人避免它们的一个重要原因。我们可以使用尾随运算符格式化三元组,这有助于我们将语句分成不同的行,从而提高可读性。