如何对ruby数组分组



我有一个这样的数组:

[["vietnam", "Hồ Chí Minh", "ho-chi-minh", 131],
["vietnam", "Hà Nội", "ha-noi", 96],
["lao", "Vien", "vien", 26],
["thailand", "Bangkok", "bangkok", 11],
["vietnam", "Đồng Nai", "dong-nai", 10],
["china", "Shanghai", "shanghia", 8],
["lao", "ABC", "abcc", 24],
["vietnam", "Long An", "long-an", 6]]

,我想生成一个哈希函数,键基于数组元素的第一个元素,如下所示

{:vietnam =>
[["Hồ Chí Minh", "ho-chi-minh", 131],
["Hà Nội", "ha-noi", 96],
["Long An", "long-an", 6]],
:lao => 
[["Vien", "vien", 26],
["ABC", "abcc", 24]],
:thailand =>
[["Bangkok", "bangkok", 11]],
:china =>
[["Shanghai", "shanghai", 8]]
}

我该怎么做?

使用group_byArray#shift的组合功率

array = [["vietnam", "Hồ Chí Minh", "ho-chi-minh", 131],
["vietnam", "Hà Nội", "ha-noi", 96],
["lao", "Vien", "vien", 26],
["thailand", "Bangkok", "bangkok", 11],
["vietnam", "Đồng Nai", "dong-nai", 10],
["china", "Shanghai", "shanghia", 8],
["lao", "ABC", "abcc", 24],
["vietnam", "Long An", "long-an", 6]
]
hash = array.group_by { |e| e.shift }

输出
=> {
"vietnam"  => [["Hồ Chí Minh", "ho-chi-minh", 131], ["Hà Nội", "ha-noi", 96], ["Đồng Nai", "dong-nai", 10], ["Long An", "long-an", 6]],
"lao"      => [["Vien", "vien", 26], ["ABC", "abcc", 24]],
"thailand" => [["Bangkok", "bangkok", 11]],
"china"    => [["Shanghai", "shanghia", 8]]
}

可以使用ruby的group_by方法:

array = [["vietnam", "Hồ Chí Minh", "ho-chi-minh", 131],
["vietnam", "Hà Nội", "ha-noi", 96],
["lao", "Vien", "vien", 26],
["thailand", "Bangkok", "bangkok", 11],
["vietnam", "Đồng Nai", "dong-nai", 10],
["china", "Shanghai", "shanghia", 8],
["lao", "ABC", "abcc", 24],
["vietnam", "Long An", "long-an", 6]]
hash = array.group_by { |a| a[0] } 
# {"vietnam"=>[["vietnam", "Hồ Chí Minh", "ho-chi-minh", 131], ["vietnam", "Hà Nội", "ha-noi", 96], ["vietnam", "Đồng Nai", "dong-nai", 10], ["vietnam", "Long An", "long-an", 6]], "lao"=>[["lao", "Vien", "vien", 26], ["lao", "ABC", "abcc", 24]], "thailand"=>[["thailand", "Bangkok", "bangkok", 11]], "china"=>[["china", "Shanghai", "shanghia", 8]]}
hash.each { |k, v| hash[k] = v.map { |arr| arr.drop(1) } }
# {"vietnam"=>[["Hồ Chí Minh", "ho-chi-minh", 131], ["Hà Nội", "ha-noi", 96], ["Đồng Nai", "dong-nai", 10], ["Long An", "long-an", 6]], "lao"=>[["Vien", "vien", 26], ["ABC", "abcc", 24]], "thailand"=>[["Bangkok", "bangkok", 11]], "china"=>[["Shanghai", "shanghia", 8]]}