2013-07-20 59 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