1

我有一个哈希数组:

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

我想搜索并替换:key1if "replaced"CONTAINS :key"one" 的值。

然后生成的数组将读取:

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

我尝试使用我之前的帖子并在“用另一个替换哈希中的一个匹配值include?”中回复,但无济于事。

这些将得到完全匹配:

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

将:

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

但我需要它来包含字符串术语。

4

3 回答 3

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"}]
于 2013-04-20T16:10:33.883 回答
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!, like map, 需要一个返回值,否则它会在迭代中的那个位置返回一个 nil 。三元语句非常适合这一点。在 Ruby 中保持三元语句看起来不错比在像 Perl 这样的语言中更困难,我认为这是很多人避免使用它们的一个重要原因。不过,我们可以使用尾随运算符格式化三元组,这有助于我们将语句分成单独的行,从而提高可读性。

于 2013-04-20T23:05:57.213 回答
2

您可以使用=~来查找字符串中包含该单词的模式one,例如:

arr.each{|item| item[:key1] = "replaced" if item[:key1] =~ /one/ }
于 2013-04-20T16:09:26.200 回答