Ruby on Rails:如何根据初始值对名称列表进行分组?

时间:2013-11-19 05:37:09

标签: ruby-on-rails ruby

我在数组中有一个名单列表,例如:

['John', 'Smith', 'Doe', 'Lee', 'Jack']

我希望它像这样分组:

['Doe']
['Jack', 'John']
['Lee']
['Smith']

我如何使用ruby on rails?

2 个答案:

答案 0 :(得分:7)

Enumerable的group_by是你的朋友:

names = ['John', 'Smith', 'Doe', 'Lee', 'Jack']
names.group_by{ |n| n[0] } 
# => {"J"=>["John", "Jack"], "S"=>["Smith"], "D"=>["Doe"], "L"=>["Lee"]}
names.group_by{ |n| n[0] }.values 
# => [["John", "Jack"], ["Smith"], ["Doe"], ["Lee"]]

来自文档:

  

按块的结果对集合进行分组。返回一个哈希,其中键是块的计算结果,值是集合中与键对应的元素数组。

如果您想按字母顺序排序,只需在使用group_by之前对初始数组进行排序。因为Ruby维护了散列的插入顺序,所以散列的结果值也将按顺序排列:

names.sort.group_by{ |n| n[0] }.values 
# => [["Doe"], ["Jack", "John"], ["Lee"], ["Smith"]]

答案 1 :(得分:0)

另一种选择是使用块方法:

names = ['John', 'Smith', 'Doe', 'Lee', 'Jack']
p names.sort.chunk(&:chr).map(&:last) #=> [["Doe"], ["Jack", "John"], ["Lee"], ["Smith"]]