map_values()用于Ruby哈希?

vd8tlhqk  于 12个月前  发布在  Ruby
关注(0)|答案(9)|浏览(121)

我在Ruby中缺少一个Hash方法,它只转换/Maphash的值。

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

dfuffjeb1#

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

sbdsn5lh2#

你可以像这样对hash类进行猴子修补

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 })
apeeds0o

apeeds0o3#

你也可以使用Hash#update来实现:

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它:

h.dup.update(h) { |_, v| v.size }
#=> { 1 => 4, 2 => 1, 3 => 3 }

h
#=> { 1 => [9, 2, 3, 4], 2 => [6], 3 => [5, 7, 1] }
lsmd5eda

lsmd5eda4#

这个对你有用

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

eh57zj3b5#

没有map,只有each

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

2w2cym1i6#

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

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

093gszye7#

这里还有一种实现它的方法:

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

ix0qys7i8#

在DeepEscape库中有一个此方法的实现: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}
vbopmzt1

vbopmzt19#

您可以使用hash.each_value.map { |value| puts(value) }来遍历散列的所有值。

相关问题