Arrays 如何将嵌套数组转换为值为数组的哈希或JSON

Arrays 如何将嵌套数组转换为值为数组的哈希或JSON,arrays,json,ruby,hash,Arrays,Json,Ruby,Hash,我有这个嵌套数组 array = [["Colorado", "Adams County"], ["Colorado", "Jefferson County"], ["California", "Amador"], ["California", "Tulare"]] 我在等这个 {"Colorado" => ["Adams County", "Jefferson County"], "California" => ["Amador", "Tulare"]} 我试过这些: arra

我有这个嵌套数组

array = [["Colorado", "Adams County"], ["Colorado", "Jefferson County"], ["California", "Amador"], ["California", "Tulare"]]
我在等这个

{"Colorado" => ["Adams County", "Jefferson County"], "California" => ["Amador", "Tulare"]}
我试过这些:

array.to_h
#=> {"Colorado"=>"Jefferson County", "California"=>"Tulare"}

b = Hash.new
array.uniq.map{|k,v| b[k] = v}
#=> {"Colorado"=>"Jefferson County", "California"=>"Tulare"}

array.uniq.map{|k,v| b[k] << v}
#=> Error

array.map{|k,v| b[k] = [v]}
#=> {"Colorado"=>["Jefferson CountyAdams CountyJefferson CountyAdams County"], "California"=>["TulareAmadorTulareAmador"]}`
array.to_h
#=>{“科罗拉多州”=>“杰斐逊县”、“加利福尼亚州”=>“图拉雷”}
b=散列。新
array.uniq.map{| k,v | b[k]=v}
#=>{“科罗拉多州”=>“杰斐逊县”、“加利福尼亚州”=>“图拉雷”}
数组.uniq.map{| k,v | b[k]错误
array.map{| k,v | b[k]=[v]}
#=>{“Colorado”=>[“Jefferson CountyYadams CountyJefferson CountyYadams County”],“California”=>[“Tularemadortulareamador”]}`
如何将值作为数组获取?

看起来您希望按第一个元素重新组合数组数组

array
  .group_by { |k, _| k }
  .each_value { |a| a.map! { |_, v| v } } # => {"Colorado"=>["Adams County", "Jefferson County"], "California"=>["Amador", "Tulare"]}

您可以首先通过调用
group\u,然后
转换\u值
(Ruby 2.4+):

如果您的ruby没有
transform\u值
,您可以只
map!

hash = array.group_by(&:first)
hash.each_value do |value_list|
  value_list.map!(&:last)
end
# => {"Colorado"=>["Adams County", "Jefferson County"], "California"=>["Amador", "Tulare"]}

array
c
之间有什么区别?(
array
首先是什么?)什么是
b
?对不起,我在控制台上做了一些工作,我现在已经编辑了变量。应该更清楚了
每个值如何
?哦,我喜欢移位值。但是
array怎么样?groupby(&:shift).每个_值(&:展平!)
?在早期的Ruby版本中也可以使用,而且有点短。很酷。
。每个_值
都很好。只是想知道,是否可以使用
。排序
展平
对数组值进行排序?说到排序……上面显示的输出真的是从代码中得到的吗?它真的是“加利福尼亚”吗在“Colorado”之前出现?这是否违反了“密钥插入顺序”@StefanPochmann这是
pry
输出结果的方式:它对散列进行排序。
hash = array.group_by(&:first)
hash.each_value do |value_list|
  value_list.map!(&:last)
end
# => {"Colorado"=>["Adams County", "Jefferson County"], "California"=>["Amador", "Tulare"]}
[["Colorado", "Adams County"], ["Colorado", "Jefferson County"],
 ["California", "Amador"], ["California", "Tulare"]].
   each_with_object(Hash.new { |h, k| h[k] = [] }) do |(k, v), h|
     h[k] << v
   end
#⇒ {
#  "California" => [
#    [0] "Amador",
#    [1] "Tulare"
#  ],
#    "Colorado" => [
#    [0] "Adams County",
#    [1] "Jefferson County"
#  ]
# }
[["Colorado", "Adams County"], ["Colorado", "Jefferson County"], 
 ["California", "Amador"], ["California", "Tulare"]].
   group_by(&:shift).transform_values(&:flatten)