像Array#map一样轻松映射Hash

mbi*_*ras 2 ruby hash

有时我想映射一个集合.如果它是一个阵列很容易:

foo = [1,2,3]
foo.map {|v| v + 1}
#=> [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

但哈希不能以相同的方式工作:

bar = {a: 1, b: 2, c: 3}
bar.map{|k,v| v+1}
#=> [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

我真正喜欢的是:

bar = {a: 1, b: 2, c: 3}
bar.baz{|k,v| v+1}
#=> {:a=>2, :b=>3, :c=>4}
Run Code Online (Sandbox Code Playgroud)

Hash#baz某种方法在哪里.是否有一种简单的方法可以获得散列的"类似地图"的体验?

Jor*_*ing 12

在Ruby 2.4中,您可以使用内置的Hash#transform_values:

bar = {a: 1, b: 2, c: 3}
# => {:a=>1, :b=>2, :c=>3}
bar.transform_values {|v| v+1 }
# => {:a=>2, :b=>3, :c=>4}
Run Code Online (Sandbox Code Playgroud)

  • 是的,那些都可以工作,但我怀疑增加散列中的值不是OP任务的实际问题. (4认同)
  • @SagarPandya`transform_keys`是在Ruby 2.5中引入的. (2认同)

mwp*_*mwp 6

只是指出满足这一需求的明显且最常见的解决方案:

bar = {a: 1, b: 2, c: 3}
# => {:a=>1, :b=>2, :c=>3}
bar.map { |k, v| [k, v + 1] }.to_h
# => {:a=>2, :b=>3, :c=>4}
Run Code Online (Sandbox Code Playgroud)

  • `哈希[bar.map {|k,v| [k,v+1]}]` 是另一种选择。 (2认同)