Ruby on rails 首先对数组的特定项进行排序
我有一个ruby数组,看起来像这样:Ruby on rails 首先对数组的特定项进行排序,ruby-on-rails,ruby,arrays,sorting,Ruby On Rails,Ruby,Arrays,Sorting,我有一个ruby数组,看起来像这样: my_array = ['mushroom', 'beef', 'fish', 'chicken', 'tofu', 'lamb'] 我想对数组进行排序,使“chicken”和“beef”成为前两个项目,然后按字母顺序对其余项目进行排序。我该怎么做呢 irb> my_array.sort_by { |e| [ e == 'chicken' ? 0 : e == 'beef' ? 1 : 2, e ] } #=> ["chicken", "be
my_array = ['mushroom', 'beef', 'fish', 'chicken', 'tofu', 'lamb']
我想对数组进行排序,使“chicken”和“beef”成为前两个项目,然后按字母顺序对其余项目进行排序。我该怎么做呢
irb> my_array.sort_by { |e| [ e == 'chicken' ? 0 : e == 'beef' ? 1 : 2, e ] }
#=> ["chicken", "beef", "fish", "lamb", "mushroom", "tofu"]
这将为数组的每个元素创建一个排序键,然后按排序键对数组元素进行排序。由于排序键是一个数组,它会按位置进行比较,因此[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"]
如果只在运行时获取数据,我的方法更通用、更有用
my_array = ['mushroom', 'beef', 'fish', 'chicken', 'tofu', 'lamb']
starters = ['chicken', 'beef']
starters + (my_array.sort - starters)
# => ["chicken", "beef" "fish", "lamb", "mushroom", "tofu"]
可以
firsts = ["chicken", "beef"]
[*firsts, *(my_array.sort - firsts)]
#=> ["chicken", "beef", "fish", "lamb", "mushroom", "tofu"]
如果“鸡肉”或“牛肉”在
my_array
中出现的次数多于(或少于)一次,那么其结果将不会是对my_array
的重新排序。在撰写本文时,Rampion对Ruby 2.2.2的评论似乎不正确。