在ruby中对两个数组进行排序或映射

时间:2014-07-22 11:29:29

标签: ruby-on-rails ruby arrays

我有一个剖面数组['part one','part two']和一个项目对象数组[item1,item2,item3]

每个item对象都有一个section属性(在这种情况下,值为' part one'或' part two')和order属性是一个整数。

我想创建一个像

这样的数组
[ ['part one',[item1,item3]],['part two',[item3]] ]

[['part one',item1,item3],['part two',item3]]

其中

item1.section == 'part one' and item1.order == 1, 
item3.section == 'part one' and item3.order == 2, 
item2.section == 'part two' and item2.order == 1

1 个答案:

答案 0 :(得分:3)

要按section分组,并按order排序,您可以执行以下操作:

items.sort_by(&:order).group_by(&:section).to_a
# => [["part one", [item1, item3]], ["part two", [item2]]]

sort_by根据order属性对所有项目进行排序,而group_by将它们分组为数组哈希,每个键都是不同的sectionto_a将哈希变成数组。


如果您想保留section列表的顺序,可以使用它来定义订单,而不是to_a

grouped = items.sort_by(&:order).group_by(&:section)
# => { "part one" => [item1, item3], "part two" => [item2] }
sorted = sections.zip(sections.map { |s| grouped[s] })
# => [["part one", [item1, item3]], ["part two", [item2]]]