首先对数组的特定项进行排序

Mat*_*ins 6 ruby arrays sorting ruby-on-rails

我有一个看起来像这样的ruby数组:

my_array = ['mushroom', 'beef', 'fish', 'chicken', 'tofu', 'lamb']
Run Code Online (Sandbox Code Playgroud)

我想对数组进行排序,以便'chicken'和'beef'是前两项,然后其余项按字母顺序排序.我该怎么做呢?

ram*_*ion 11

irb> my_array.sort_by { |e| [ e == 'chicken' ? 0 : e == 'beef' ? 1 : 2, e ] }
 #=> ["chicken", "beef", "fish", "lamb", "mushroom", "tofu"]
Run Code Online (Sandbox Code Playgroud)

这将为数组的每个元素创建一个排序键,然后按排序键对数组元素进行排序.由于排序键是一个数组,因此按位置进行比较[0, 'chicken'] < [1, 'beef'] < [2, 'apple' ] < [2, 'banana'].

如果您不知道在运行之前要将哪些元素排序到前面,您仍然可以使用此技巧:

 irb> promotables = [ 'chicken', 'beef' ]
  #=> [ 'chicken', 'beef' ]
 irb> my_array.sort_by { |e| [ promotables.index(e) || promotables.size, e ] }
  #=> ["chicken", "beef", "fish", "lamb", "mushroom", "tofu"]
 irb> promotables = [ 'tofu', 'mushroom' ]
  #=> [ 'tofu', 'mushroom' ]
 irb> my_array.sort_by { |e| [ promotables.index(e) || promotables.size, e ] }
  #=> [ "tofu", "mushroom", "beef", "chicken", "fish", "lamb"]
Run Code Online (Sandbox Code Playgroud)


Tho*_*oll 6

如果只在运行时获取数据,那么我的通用性更高,更有用.

my_array = ['mushroom', 'beef', 'fish', 'chicken', 'tofu', 'lamb']
starters = ['chicken', 'beef']
starters + (my_array.sort - starters)
# => ["chicken", "beef" "fish", "lamb", "mushroom", "tofu"]
Run Code Online (Sandbox Code Playgroud)