我有一个objects
的数组。每个对象都有一个属性,我们将其称为display_name
。基于预定义列表的红宝石排序
我想基于预定义的值列表对这个数组进行排序。
因此,如果预定义列表看起来像这样["Ball", "Cat", "Helicopter", "France"]
然后与DISPLAY_NAME属性相匹配"Ball"
与在列表的头,那些在名单"Cat"
秒等等等等的对象。
我有一个objects
的数组。每个对象都有一个属性,我们将其称为display_name
。基于预定义列表的红宝石排序
我想基于预定义的值列表对这个数组进行排序。
因此,如果预定义列表看起来像这样["Ball", "Cat", "Helicopter", "France"]
然后与DISPLAY_NAME属性相匹配"Ball"
与在列表的头,那些在名单"Cat"
秒等等等等的对象。
您可以使用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"}]
你应该能够做这样的事情:
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) }
注意,如果你有相同的显示名称的多个项目,这是不确定性的。