我错过了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 }
答案 0 :(得分:6)
Ruby 2.4引入了方法Hash#transform_values
和Hash#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}