使用函数式编程对哈希中的每个项执行转换

时间:2014-06-13 14:29:19

标签: ruby

转换此内容的最简洁方法是什么:

{
    "AT"=>"de-DE",
    "DE"=>"de-DE",
    "LI"=>"de-DE"
}

到此?

{
    "AT"=>"de",
    "DE"=>"de",
    "LI"=>"de"
}

我无法通过Hash.map找到解决方法。

我不想创建任何临时变量或改变初始哈希。

7 个答案:

答案 0 :(得分:2)

Hash[h.map{|k,v| [k,v[0..1]]}]

答案 1 :(得分:2)

h = {
    "AT"=>"de-DE",
    "DE"=>"de-DE",
    "LI"=>"de-DE"
}
p result = h.each_with_object({}){|(k,v), res| res[k] = v[0,2] }
# => {"AT"=>"de", "DE"=>"de", "LI"=>"de"}

答案 2 :(得分:1)

我愿意

hash = {
    "AT"=>"de-DE",
    "DE"=>"de-DE",
    "LI"=>"de-DE"
}

Hash[hash.map { |k,v| [k,v[/(.*?)-/,1]] }]
# => {"AT"=>"de", "DE"=>"de", "LI"=>"de"}

另一种方式: -

hash.each_with_object({}) { |(k, v), h| h[k] = v[/(.*?)-/,1] }
# => {"AT"=>"de", "DE"=>"de", "LI"=>"de"}

答案 3 :(得分:1)

鉴于最近有足够多的Ruby版本,这就是诀窍而且#34;向前读取"就像你想要的那样:

h.map { |k,v| [k, v[0..1]] }.to_h
#=> {"AT"=>"de", "DE"=>"de", "LI"=>"de"}

答案 4 :(得分:0)

也许这会起作用

p = Hash.new
{"AT"=>"de-DE", "DE" => "de-DE", "LI" => "de-DE" }.each{ |k,v| p[k] = v.split('-')[0] }

答案 5 :(得分:0)

除了散列和结果中出现的字符串之外,这不会创建任何中间对象。

{
    "AT"=>"de-DE",
    "DE"=>"de-DE",
    "LI"=>"de-DE"
}
.keys.each_with_object({}){|k, h| h[k] = "de"}

答案 6 :(得分:0)

这是一个使用Enumerable#each_with_object(Ruby v1.9 +)的伪装Object#tap

h = { "AT"=>"de-DE", "DE"=>"de-DE", "LI"=>"de-DE" }

{}.tap { |g| h.each_key { |k| g[k] = h[k][/[a-z]+/] } }
  #=> {"AT"=>"de", "DE"=>"de", "LI"=>"de"}