我有一个这样的数组:
[["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_by
和Array#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]]}