Dưới đây là một phiên bản của của steenslag rằng hoạt động khi các mảng không cùng kích thước:
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
có vẻ như một giữ chỗ hợp lý cho các giá trị bị mất tích nhưng bạn có thể, tất tất nhiên, sử dụng bất cứ điều gì có ý nghĩa.
Ví dụ:
>> 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, ""]
dễ nhất là một "vòng lặp kép", nhưng nó vẫn còn một lớp lót; nó có tệ không? –
IMO quá chuyên biệt để trở thành một tính năng tích hợp và quá dễ dàng để thực hiện "bằng tay" :) –
Sẽ không tệ nếu ai đó đăng bài dễ dàng. :-) – Larsenal