Какой самый элегантный способ выделить объекты в массиве, уникальные по одному или нескольким атрибутам?
Эти объекты хранятся в ActiveRecord, поэтому можно использовать методы AR.
ruby-on-rails
ruby
arrays
unique
остаться, таких
источник
источник
require 'backports'
:-)@photos.uniq &:album_id
Добавьте
uniq_by
метод в массив в своем проекте. Работает по аналогии сsort_by
. Такuniq_by
это ,uniq
какsort_by
этоsort
. Использование:Реализация:
Обратите внимание, что он возвращает новый массив, а не изменяет ваш текущий на месте. Мы не написали
uniq_by!
метод, но он должен быть достаточно простым, если вы захотите.РЕДАКТИРОВАТЬ: Tribalvibes указывает, что эта реализация - O (n ^ 2). Лучше было бы что-то вроде (непроверено) ...
источник
Сделайте это на уровне базы данных:
источник
Вы можете использовать этот трюк для выбора уникальных по нескольким атрибутам элементов из массива:
источник
Первоначально я предлагал использовать
select
метод для массива. А именно:[1, 2, 3, 4, 5, 6, 7].select{|e| e%2 == 0}
дает нам[2,4,6]
.Но если вам нужен первый такой объект, используйте
detect
.[1, 2, 3, 4, 5, 6, 7].detect{|e| e>3}
дает нам4
.Я не уверен, что вы здесь собираетесь.
источник
Мне нравится использование jmah хэша для обеспечения уникальности. Вот еще пара способов снять шкуру с этой кошки:
Это хороший однострочник, но я подозреваю, что это может быть немного быстрее:
источник
Если я правильно понимаю ваш вопрос, я решил эту проблему, используя квази-хакерский подход, заключающийся в сравнении объектов Marshaled, чтобы определить, изменяются ли какие-либо атрибуты. Примером может служить инъекция в конце следующего кода:
источник
Самый элегантный способ, который я нашел, - это спин-офф
Array#uniq
с использованием блока… Это тоже лучше читается!
источник
Вы можете использовать хэш, который содержит только одно значение для каждого ключа:
источник
Используйте Array # uniq с блоком:
Или более лаконичный подход:
источник
Rails также имеет
#uniq_by
метод.Ссылка: параметризованный массив # uniq (т.е. uniq_by)
источник
Мне нравятся ответы jmah и Head. Но сохраняют ли они порядок в массиве? Они могут быть в более поздних версиях ruby, поскольку в спецификации языка были прописаны некоторые требования к сохранению порядка вставки хэшей, но вот аналогичное решение, которое я люблю использовать, которое сохраняет порядок независимо.
источник
Реализация ActiveSupport:
источник
Теперь, если вы можете отсортировать значения атрибутов, это можно сделать:
Это для уникального 1-атрибута, но то же самое можно сделать с лексикографической сортировкой ...
источник