2012-04-02 18 views
3

Ich habe eine Reihe von objects. Jedes Objekt hat ein Attribut, das wir display_name nennen.Ruby Sortierung basierend auf vordefinierten Liste

Ich möchte dieses Array basierend auf einer vordefinierten Liste von Werten sortieren.

Also, wenn die vordefinierte Liste sieht so etwas wie diese ["Ball", "Cat", "Helicopter", "France"]

Dann wird die Objekte mit dem display_name Attribute "Ball" passend an der Spitze der Liste mit, nach denen mit "Cat" Sekunden in der Liste und so weiter und so weiter.

Antwort

8

Sie Enumerable#sort_by verwenden können:

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

sollten Sie in der Lage sein, etwas zu tun:

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

Hinweis, dies ist nicht deterministisch, wenn Sie mehrere Artikel mit dem gleichen Anzeigenamen haben.

Verwandte Themen