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

时间:2012-07-30 05:28:55

标签: ruby hash

我有一个二维数组

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

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

请告知。

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

3 个答案:

答案 0 :(得分:4)

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

它的作用:

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

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

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

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

答案 1 :(得分:1)

v.inject({­}) do |res,­ ar|
  res[ar.fir­st] ||= []
  res[ar.fir­st] << ar.la­st
  res
end

答案 2 :(得分:1)

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