2012-04-02 25 views
3

我有一个objects的数组。每个对象都有一个属性,我们将其称为display_name基于预定义列表的红宝石排序

我想基于预定义的值列表对这个数组进行排序。

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

然后与DISPLAY_NAME属性相匹配"Ball"与在列表的头,那些在名单"Cat"秒等等等等的对象。

回答

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"}] 
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) } 

注意,如果你有相同的显示名称的多个项目,这是不确定性的。