2012-04-02 14 views
3

私はobjectsという配列を持っています。各オブジェクトにはdisplay_nameという属性があります。定義済みリストに基づくRubyソート

この配列は、あらかじめ定義された値のリストに基づいて並べ替える必要があります。

事前に定義されたリストは、この["Ball", "Cat", "Helicopter", "France"]

のようになりますのであれば次に"Ball"に一致DISPLAY_NAME属性を持つオブジェクトは"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) } 

注意、これは確定的ではありません。

関連する問題