2013-07-20 60 views
2

社區,如何實現方法「m_met」,它將重組散列數組(具有相同的大小和相同的「鍵」)到第一個元素將是「鍵」數組的形式和休息 - 每個散列的「值」。
例子:紅寶石。用於散列數組的「魔術方法」

m_met([{a: 1, b: 2, c: 3 }, {a: 4, b: 5, c: 6}]) 
# => [[:a, :b, :c], [1, 2, 3], [4, 5, 6]] 

謝謝!

回答

2
h = [{a: 1, b: 2, c: 3 }, {a: 4, b: 5, c: 6}] 
h.flat_map { |j| [j.keys, j.values] }.uniq 
# => [[:a, :b, :c], [1, 2, 3], [4, 5, 6]] 

UPDATE

h = [{a: 1, b: 2, c: 3 }, {a: 1, b: 2, c: 3}] 
[h.first.keys].concat(h.map(&:values)) 
# => [[:a, :b, :c], [1, 2, 3], [1, 2, 3]] 

h = [{a: 1, b: 2, c: 3 }, {a: 4, b: 5, c: 6}] 
[h.first.keys].concat(h.map(&:values)) 
# => [[:a, :b, :c], [1, 2, 3], [4, 5, 6]] 
+0

感謝Priti,回答N2O-boost =)! –

+0

@ SergRa6n * N2O-boost *表示? :))) –

+0

這意味着「非常快速的迴應」)) –

2

如果沒有額外的假設也可能是這樣的:

hs = [{a: 1, b: 2, c: 3 }, {a: 4, b: 5, c: 6}] 
ks = hs.first.keys 
[ks] + hs.map{ |h| h.values_at(*ks)} 

UPDATE坦白說,我寧願二號線(所以我不需要等等)

ks = hs.flat_map(&:keys).uniq 
+1

這是美麗的。 – sawa

+1

確實令人驚歎。 – naomik

+1

'ks = hs.flat_map(&:keys).uniq'根據假設,哈希都具有相同的密鑰,因此代碼會執行大量不必要的工作。隨着哈希數達到無窮大,該代碼將花費無限的時間來執行,而只檢查第一個哈希以獲得密鑰的代碼將花費相同的時間量,而不管有多少哈希。坦率地說,我不知道你爲什麼做這個改變。 – 7stud