2012-04-02 56 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) } 

注意,如果你有相同的顯示名稱的多個項目,這是不確定性的。