Ruby哈希的map_values()?

时间:2015-12-14 10:38:29

标签: ruby hash

我错过了Ruby中的Hash方法来仅转换/映射哈希值。

h = { 1 => [9,2,3,4], 2 => [6], 3 => [5,7,1] }
h.map_values { |v| v.size }
#=> { 1 => 4, 2 => 1, 3 => 3 } 

如何在Ruby中存档?

更新:我正在寻找map_values()的实施。

# more examples
h.map_values { |v| v.reduce(0, :+) }
#=> { 1 => 18, 2 => 6, 3 => 13 } 

h.map_values(&:min)
#=> { 1 => 2, 2 => 6, 3 => 1 }

8 个答案:

答案 0 :(得分:6)

Ruby 2.4引入了方法Hash#transform_valuesHash#transform_values!以及所需的行为。

h = { 1=>[9, 2, 3, 4], 2=>[6], 3=>[5, 7, 1] }
h..transform_values { |e| e.size }
#=> {1=>4, 2=>1, 3=>3}

答案 1 :(得分:5)

您可以对哈希类进行猴子修补,就像这样

class Hash
  def map_values
    map { |k, v|
      [k, yield(v)]
    }.to_h
  end
end

p ({1 => [1,1,1,1], 2 => [2], 3 => [3,3,3]}.map_values { |e| e.size })

答案 2 :(得分:2)

这将为您解决问题

h = { 1 => [1,1,1,1], 2 => [2], 3 => [3,3,3] }
h.map {|k,v| [k, v.size] }.to_h

答案 3 :(得分:2)

map,仅each

h = { 1 => [1,1,1,1], 2 => [2], 3 => [3,3,3] }
h.each{|k,v| h[k] = v.size}

答案 4 :(得分:2)

您也可以使用Hash#update

String parentOSVersion = OSPattern.substringBefore('-');

它将一个哈希中具有重复键的所有值替换为另一个哈希中的值,或者,如果给出了块,则将其替换为调用块的结果。您可以将原始哈希作为参数传递,以确保替换所有值。

请注意,这会修改哈希值!如果您想首先保留原始哈希值h = { 1 => [9, 2, 3, 4], 2 => [6], 3 => [5, 7, 1] } h.update(h) { |_, v| v.size } #=> { 1 => 4, 2 => 1, 3 => 3 }

dup

答案 5 :(得分:1)

您可以通过以下方式实现这一目标:

h.map { |a, b| [a, b.size] }.to_h
#=> {1=>4, 2=>1, 3=>3}

答案 6 :(得分:1)

这是实现它的另一种方法:

h = { 1 => [1,1,1,1], 2 => [2], 3 => [3,3,3] }
p h.keys.zip(h.values.map(&:size)).to_h
#=> {1=>4, 2=>1, 3=>3}

答案 7 :(得分:1)

在DeepEnumerable库中有这个方法的实现:https://github.com/dgopstein/deep_enumerable/

它被称为shallow_map_values

>> require 'deep_enumerable'    
>> h = { 1 => [9,2,3,4], 2 => [6], 3 => [5,7,1] }    
>> h.shallow_map_values { |v| v.size }
=> {1=>4, 2=>1, 3=>3}