ruby 将嵌套数组转换为哈希

Posted

技术标签:

【中文标题】ruby 将嵌套数组转换为哈希【英文标题】:ruby turn a nested array into a hash 【发布时间】:2015-08-12 05:37:41 【问题描述】:

有没有一种优雅的方式来转换表单的嵌套数组

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

成散列形式

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

【问题讨论】:

【参考方案1】:
array.each_with_object()|a, h| (h[a.first]||=[] )<< a.last 

【讨论】:

【参考方案2】:
ary = [['a', 1], ['a', 2], [nil, 3], [nil, 4], ['b', 6], ['b', 8]]
ary.group_by(&:first).map |k, v| k => v.map(&:last) 

【讨论】:

你的命令的输出是哈希列表,而不仅仅是一个哈希【参考方案3】:

一种方法可能是:

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]

【讨论】:

【参考方案4】:

这是一种方式:

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]

【讨论】:

【参考方案5】:
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] 

【讨论】:

感谢所有建议,我会选择Hash[array.group_by(&amp;:first).map|k,v| [k, v.map(&amp;:last)]],因为我认为它是最易读的(?)

以上是关于ruby 将嵌套数组转换为哈希的主要内容,如果未能解决你的问题,请参考以下文章

将数组的Ruby数组转换为哈希

ruby 将哈希值转换为排序的字符串数组,以便与另一个哈希值进行比较

ruby Rails'index_by:将数组转换为哈希的简便方法

Ruby:将String转换为嵌套数组的Integer值

Rails:如何将对象数组的哈希转换为 json

将带有整数的数组转换为散列哈希值[closed]