将 2 元素数组的数组转换为哈希,其中重复的键附加附加值 [英] Convert array of 2-element arrays into a hash, where duplicate keys append additional values
本文介绍了将 2 元素数组的数组转换为哈希,其中重复的键附加附加值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
给定一个数组:
array = [[:a,:b],[:a,:c],[:c,:b]]
返回以下哈希:
hash = { :a => [:b,:c] , :c => [:b] }
hash = Hash[array]
覆盖之前的关联,产生:
hash = Hash[array]
overwrites previous associations, producing:
hash = { :a => :c , :c => :b }
推荐答案
使用函数式婴儿步骤:
irb:01.0> array = [[:a,:b],[:a,:c],[:c,:b]]
#=> [[:a, :b], [:a, :c], [:c, :b]]
irb:02.0> array.group_by(&:first)
#=> {:a=>[[:a, :b], [:a, :c]], :c=>[[:c, :b]]}
irb:03.0> array.group_by(&:first).map{ |k,a| [k,a.map(&:last)] }
#=> [[:a, [:b, :c]], [:c, [:b]]]
irb:04.0> Hash[ array.group_by(&:first).map{ |k,a| [k,a.map(&:last)] } ]
#=> {:a=>[:b, :c], :c=>[:b]}
使用命令式编程:
irb:10.0> h = Hash.new{ |h,k| h[k]=[] }
#=> {}
irb:11.0> array.each{ |k,v| h[k] << v }
#=> [[:a, :b], [:a, :c], [:c, :b]]
irb:12.0> h
#=> {:a=>[:b, :c], :c=>[:b]}
作为一个命令式的单行:
As an imperative one-liner:
irb:13.0> h = Hash.new{ |h,k| h[k]=[] }.tap{ |h| array.each{ |k,v| h[k] << v } }
#=> {:a=>[:b, :c], :c=>[:b]}
或者使用大家最喜欢的inject
:
Or using everyone's favorite inject
:
irb:14.0> array.inject(Hash.new{ |h,k| h[k]=[] }){ |h,(k,v)| h[k] << v; h }
#=> {:a=>[:b, :c], :c=>[:b]}
如果您真的希望单个值不会作为数组发生碰撞,您可以将它们取消排列作为后处理步骤,或者使用不同的哈希累积策略,仅在碰撞时创建数组.或者,把你的头围绕在这个:
If you really want to have single values not collided as an array, you can either un-array them as a post-processing step, or use a different hash accumulation strategy that only creates an array upon collision. Alternatively, wrap your head around this:
irb:17.0> hashes = array.map{ |pair| Hash[*pair] } # merge many mini hashes
#=> [{:a=>:b}, {:a=>:c}, {:c=>:b}]
irb:18.0> hashes.inject{ |h1,h2| h1.merge(h2){ |*a| a[1,2] } }
#=> {:a=>[:b, :c], :c=>:b}
这篇关于将 2 元素数组的数组转换为哈希,其中重复的键附加附加值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文