简体   繁体   English

红宝石将嵌套数组变成哈希

[英]ruby turn a nested array into a hash

Is there an elegant way to turn a nested array of the form 有没有一种优雅的方法来转换表格的嵌套数组

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

into a hash of the form 变成形式的哈希

{"a" => [1,2], nil => [3,4], "b" => [6,8]}

This is one way: 这是一种方法:

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]}
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] }

One way could be: 一种方法是:

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]}
array.each_with_object({}){|a, h| (h[a.first]||=[] )<< a.last }
ary = [['a', 1], ['a', 2], [nil, 3], [nil, 4], ['b', 6], ['b', 8]]
ary.group_by(&:first).map {|k, v| {k => v.map(&:last)} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM