哈希的棘手变换 - >排列

时间:2009-08-11 09:29:02

标签: ruby arrays hash functional-programming

我有这样的结构:

{:foo => ['foo1', 'foo2'], :bar => ['bar1']}

我想转变成:

[[:foo, "foo1"], [:foo, "foo2"], [:bar, "bar1"]]

我目前的解决方案势在必行:

result = []
h.each do |k,v|
  v.each do |value|
    result << [k, value]
  end
end

虽然这有效,但我确信有更优雅的方式来写这个,但我无法弄清楚。我想知道面向功能的解决方案是什么样的?

2 个答案:

答案 0 :(得分:7)

h.inject([]) do |arr, (k,v)|
  arr + v.map {|x| [k,x] }
end

答案 1 :(得分:0)

这样的事情怎么样?我希望有一些东西可以添加一堆数组,但我不知道,所以我实现了自己的。

class Array
  def concatArrays # concatenates an array of arrays
    inject([]) {|acc, x| acc + x}
  end
end

h.collect{|k,v| v.collect{|value| [k,value]}}.concatArrays