我有一个objects
数组。每个对象都有一个我们称之为display_name
的属性。
我想根据预定义的值列表对此数组进行排序。
因此,如果预定义列表看起来像这样["Ball", "Cat", "Helicopter", "France"]
然后,display_name属性与"Ball"
匹配的对象位于列表的头部,列表中"Cat"
秒的对象依此类推。依此类推。
答案 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) }
请注意,如果您有多个具有相同显示名称的项目,则这不具有确定性。