I have an array like this:
[["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]]
and i want to generate a hash function with key based on first element of array elements as follows
{: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]]
}
how can i do this?
CodePudding user response:
You can use the ruby group_by method:
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]]}
CodePudding user response:
Use the combined power of group_by
and 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 }
Output
=> {
"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]]
}