开发者

Sort specific items of an array first

开发者 https://www.devze.com 2022-12-30 06:06 出处:网络
I have a ruby array that look开发者_Python百科s something like this: my_array = [\'mushroom\', \'beef\', \'fish\', \'chicken\', \'tofu\', \'lamb\']

I have a ruby array that look开发者_Python百科s something like this:

my_array = ['mushroom', 'beef', 'fish', 'chicken', 'tofu', 'lamb']

I want to sort the array so that 'chicken' and 'beef' are the first two items, then the remaining items are sorted alphabetically. How would I go about doing this?


irb> my_array.sort_by { |e| [ e == 'chicken' ? 0 : e == 'beef' ? 1 : 2, e ] }
 #=> ["chicken", "beef", "fish", "lamb", "mushroom", "tofu"]

This will create a sorting key for each element of the array, and then sort the array elements by their sorting keys. Since the sorting key is an array, it compares by position, so [0, 'chicken'] < [1, 'beef'] < [2, 'apple' ] < [2, 'banana'].

If you don't know what elements you wanted sorted to the front until runtime, you can still use this trick:

 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"]


Mine's a lot more generic and more useful if you get your data only at runtime.

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


Could just do

firsts = ["chicken", "beef"]
[*firsts, *(my_array.sort - firsts)]

#=> ["chicken", "beef", "fish", "lamb", "mushroom", "tofu"]
0

精彩评论

暂无评论...
验证码 换一张
取 消