Oto wersja steenslag-tych, który działa, gdy tablice nie są tej samej wielkości:
size = h.values.max_by { |a| a.length }.length
m = h.values.map { |a| a += [nil] * (size - a.length) }.transpose.insert(0, h.keys)
nil
wydaje się rozsądnym zastępczy dla brakujących wartości, ale można, z Oczywiście, używaj tego, co ma sens.
Na przykład:
>> h = {:a => [1, 2, 3], :b => [4, 5, 6, 7, 8], :c => [9]}
>> size = h.values.max_by { |a| a.length }.length
>> m = h.values.map { |a| a += [nil] * (size - a.length) }.transpose.insert(0, h.keys)
=> [[:a, :b, :c], [1, 4, 9], [2, 5, nil], [3, 6, nil], [nil, 7, nil], [nil, 8, nil]]
>> m.each { |r| puts r.map { |x| x.nil?? '' : x }.inspect }
[:a, :b, :c]
[ 1, 4, 9]
[ 2, 5, ""]
[ 3, 6, ""]
["", 7, ""]
["", 8, ""]
Najprostsza jest „podwójna pętla”, ale to wciąż jedna wkładka; czy to takie złe? –
IMO jest zbyt wyspecjalizowana, aby być wbudowaną funkcją, i zbyt łatwe do zrobienia "ręcznie" :) –
Nie byłoby źle, gdyby ktoś opublikował prosty jednolinijkowy. :-) – Larsenal