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)
如果只在运行时获取数据,那么我的通用性更高,更有用.
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)