Home > Net >  how to group ruby array
how to group ruby array

Time:10-14

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]]
    }
  • Related