基于预定义列表的Ruby排序

时间:2012-04-02 15:02:44

标签: ruby sorting

我有一个objects数组。每个对象都有一个我们称之为display_name的属性。

我想根据预定义的值列表对此数组进行排序。

因此,如果预定义列表看起来像这样["Ball", "Cat", "Helicopter", "France"]

然后,display_name属性与"Ball"匹配的对象位于列表的头部,列表中"Cat"秒的对象依此类推。依此类推。

2 个答案:

答案 0 :(得分:8)

您可以使用Enumerable#sort_by

list = ["Ball", "Cat", "Helicopter", "France"] 
elements = [{:display_name => 'Cat'}, {:display_name => 'Unknown'}, {:display_name => 'Ball'}]

# sort by index in the list. If not found - put as last.
elements.sort_by { |e| list.index(e[:display_name]) || list.length } 
# => [{:display_name=>"Ball"}, {:display_name=>"Cat"}, {:display_name=>"Unknown"}]

答案 1 :(得分:0)

您应该可以执行以下操作:

require 'ostruct'

list = %w{Ball Cat Helicopter France}
items = [
  OpenStruct.new(:display_name => 'Helicopter'),
  OpenStruct.new(:display_name => 'France'),
  OpenStruct.new(:display_name => 'Ball'),
  OpenStruct.new(:display_name => 'Cat'),
]

items.sort { |x,y| list.index(x.display_name) <=> list.index(y.display_name) }

请注意,如果您有多个具有相同显示名称的项目,则这不具有确定性。