Самый быстрый способ удалить ключ из массива и сделать его последним - PullRequest
1 голос
/ 31 октября 2019

Я должен удалить категорию «Другие» из массива, который изначально отсортирован по алфавиту, и просто сделать его последним индексом. Я создал этого маленького помощника, но считаю, что может быть более быстрый способ сделать это.

Массив примерно такой [#<Category id: 17, title: "Books">, #<Category id: 18, title: "Children's Clothing">,

Вот что я сделал. Оно работает. Хотя мне было интересно, есть ли более эффективный способ.

<%
@options = []
@other_option = []

@free_item_options.each do |category|
    if category.title.downcase == "other"
      @other_option << category
    else
      @options << category
    end
end

@options << @other_option[0]
%>

Ответы [ 3 ]

3 голосов
/ 31 октября 2019

В подобных случаях я обычно использую многопараметрическую сортировку.

@free_item_options.sort_by do |option|
  [
    option.title.casecmp?('other') ? 1 : 0,
    option.title,
  ]
end

В категории «Другие» будет 1 и сортировка будет последней. Все остальное будет иметь 0 и будет сортироваться между собой по возрастанию заголовка.

1 голос
/ 31 октября 2019

Существует Enumerable#partition, который предназначен для разделения коллекции на два раздела.

@other_option, @options = @free_item_options.partition { |category| category.title.casecmp?('other') }
@options.concat(@other_options)

Если вы уверены, что существует максимум один "другой"категория (которая, кажется, имеет место на основе @options << @other_option[0]). Вы также можете использовать find_index в сочетании с delete_at и <<. find_index прекращает итерации при первом совпадении.

index = @free_item_options.find_index { |category| category.title.casecmp?('other') }
@free_item_options << @free_item_options.delete_at(index) if index

Имейте в виду, что вышеприведенное действительно мутирует @free_item_options.

1 голос
/ 31 октября 2019

Другой подход - просто использовать SQL.

@free_item_options = Category.select("categories.*, (LOWER(title) = 'other') as is_other").order('is_other', :title).to_a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...