Хитрое преобразование хеша -> массив - PullRequest
1 голос
/ 11 августа 2009

У меня есть такая структура:

{: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 ]

7 голосов
/ 11 августа 2009
h.inject([]) do |arr, (k,v)|
  arr + v.map {|x| [k,x] }
end
0 голосов
/ 11 августа 2009

Как насчет этого? Хотелось бы, чтобы было что-то, чтобы добавить кучу массивов, но я ничего не знаю, поэтому я реализовал свой собственный.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...