2015-05-29 2 views

ответ

2
ary = [['a', 1], ['a', 2], [nil, 3], [nil, 4], ['b', 6], ['b', 8]] 

ary.group_by(&:first). 
# => { 'a' => [['a', 1], ['a', 2]], nil => [[nil, 3], [nil, 4]], 'b' => [['b', 6], ['b', 8]] } 
    map {|k, v| [k, v.map(&:last)] }. 
# => [['a', [1, 2]], [nil, [3, 4]], ['b', [6, 8]]] 
    to_h 
# => { 'a' => [1, 2], nil => [3, 4], 'b' => [6, 8] } 
+0

Примечание: 'to_h' будет работать только для Ruby, 2.1 или выше. – Surya

+0

thx для всех предложений, я собираюсь с 'Hash [array.group_by (&: first) .map {| k, v | [k, v.map (&: last)]}] 'как я думаю, это наиболее читаемый (?) – margo

3

Это один путь:

arr = [["a", 1], ["a", 2], [nil, 3], [nil, 4], ["b", 6], ["b", 8]] 

h = Hash.new {|hash, key| hash[key] = []} 
arr.each {|e| h[e[0]] << e[1]} 
p h #=> {"a"=>[1, 2], nil=>[3, 4], "b"=>[6, 8]} 
1

Один способ может быть:

array = [['a', 1], ['a', 2], [nil, 3], [nil, 4], ['b', 6], ['b', 8]] 
array.each_with_object(Hash.new{|h,k| h[k] = []}) {|a, obj| obj[a.first] << a.last } 
# => {"a"=>[1, 2], nil=>[3, 4], "b"=>[6, 8]} 
0
ary = [['a', 1], ['a', 2], [nil, 3], [nil, 4], ['b', 6], ['b', 8]] 
ary.group_by(&:first).map {|k, v| {k => v.map(&:last)} } 
Смежные вопросы