如何将 Ruby 中的键值对列表转换为哈希,以便将具有重复键的值存储在数组中?
How to convert, in Ruby, a list of key value pairs to a Hash, such that values with duplicate keys are stored in an array?
给定一个列表键值对,以数组的形式 - 例如[ ["key1","value1"], ["key2","value2"], ["key1", "value3"] ]
,如何将这些转换成一个存储所有值的Hash,以最优雅的方式?
对于上面的例子,我想得到{ "key1" => [ "value1", "value3" ], "key2" => [ "value2" ] }
。
到目前为止我最好的解决方案是:
kvlist.inject(Hash.new([])) do |memo,a|
memo[a[0]] = (memo[a[0]] << a[1])
memo
end
我觉得不是很好
Hash.new{ |h,k| h[k]=[] }.tap{ |h| array.each{ |k,v| h[k] << v } }
或
c = Hash.new {|h,k| h[k] = [] }
array.each{|k, v| c[k] << v}
[["key1","value1"], ["key2","value2"], ["key1", "value3"]]
.group_by(&:first).each{|_, v| v.map!(&:last)}
另一种方法是使用 Hash#update(又名 merge!
)的形式,它使用块来确定要合并的两个哈希中的键的值。
arr = [ ["key1","value1"], ["key2","value2"], ["key1", "value3"] ]
arr.each_with_object({}) { |(k,v),h| h.update(k=>[v]) { |_,o,n| o+n } }
#=> {"key1"=>["value1", "value3"], "key2"=>["value2"]}
给定一个列表键值对,以数组的形式 - 例如[ ["key1","value1"], ["key2","value2"], ["key1", "value3"] ]
,如何将这些转换成一个存储所有值的Hash,以最优雅的方式?
对于上面的例子,我想得到{ "key1" => [ "value1", "value3" ], "key2" => [ "value2" ] }
。
到目前为止我最好的解决方案是:
kvlist.inject(Hash.new([])) do |memo,a|
memo[a[0]] = (memo[a[0]] << a[1])
memo
end
我觉得不是很好
Hash.new{ |h,k| h[k]=[] }.tap{ |h| array.each{ |k,v| h[k] << v } }
或
c = Hash.new {|h,k| h[k] = [] }
array.each{|k, v| c[k] << v}
[["key1","value1"], ["key2","value2"], ["key1", "value3"]]
.group_by(&:first).each{|_, v| v.map!(&:last)}
另一种方法是使用 Hash#update(又名 merge!
)的形式,它使用块来确定要合并的两个哈希中的键的值。
arr = [ ["key1","value1"], ["key2","value2"], ["key1", "value3"] ]
arr.each_with_object({}) { |(k,v),h| h.update(k=>[v]) { |_,o,n| o+n } }
#=> {"key1"=>["value1", "value3"], "key2"=>["value2"]}