从二维数组中提取并使用数组值创建哈希

我有一个二维数组

v = [ ["ab","12"], ["ab","31"], ["gh","54"] ] 

v的子arrays的第一个元素将具有重复元素,例如"ab" 。 我想创建一个散列,将键作为子数组的第一个元素,并将值作为v中相应第二个元素的数组。

请指教。

此外,我想要这个,h = {“ab”=> [“12”,“31”],“gh”=> [“54”]}然后我想返回h.values,这样数组[返回[“12”,“31”],[“54”]]

 v.inject(Hash.new{|h,k|h[k]=[]}) { |h, (k, v)| h[k] << v ; h} 

它能做什么:

  • 注入 (也称为reduce )是一种折叠 。 维基百科定义了这样的折叠: “一系列高阶函数,分析递归数据结构,并通过使用给定的组合操作重新组合递归处理其组成部分的结果,建立返回值 ”。

  • Hash.new的块forms有两个参数,哈希本身和密钥。 如果您的默认参数是可变对象,则必须以这种方式设置默认值,否则所有键都将指向同一个数组实例。

  • inject的块中,我们得到两个参数,哈希和迭代的当前值。 由于这是一个双元素数组, (k, v)用于将后者解构为两个变量。

  • 最后,我们将每个值添加到数组中以获取其键,并返回整个哈希以用于下一次迭代。

 v.inject({}) do |res, ar| res[ar.first] ||= [] res[ar.first] << ar.last res end 
 v = [ ["ab","12"], ["ab","31"], ["gh","54"] ] 

这将获得一个哈希值,其中键是子数组中唯一的第一个元素。

 h = v.inject({}) { |c,i| (c[i.first] ||= []) << i.last; c } 

这会将哈希值转换回数组,以防万一你需要数组格式的数组。

 arr = h.collect { |k,v| [k,v] }