Удалить похожие объекты из массива - PullRequest
2 голосов
/ 13 марта 2012

У меня есть массив хэшей:

[{ item_id: 1, relationship_1: 1, relationship_2: 1, value: 'go' },
 { item_id: 2, relationship_1: 2, relationship_2: 2, value: 'stop' },
 { item_id: 3, relationship_1: 2, relationship_2: 1, value: 'stop' }, #remove
 { item_id: 4, relationship_1: 3, relationship_2: 1, value: 'go' },
 { item_id: 5, relationship_1: 1, relationship_2: 2, value: 'go' }] #remove

Я хочу удалить закомментированные строки.Нужно удалить все строки, которые имеют relationship_1 и value общего.Единственный способ, о котором я могу думать, это:

items.each do |i|
  items.each do |k|
    if i.item_id != k.item_id and i.relationship_1 == k.relationship_1 and i.value == k.value
      items.remove(k)
    end
  end
end

Это не работает, как задумано.Какой самый "рубиновый" способ удалить эти оскорбительные элементы?

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

К сожалению, uniq_by недоступно в ядре Ruby.Вытяните его с помощью require 'activesupport'.

items.uniq_by {|h| [h[:replationship_1], h[:value]] }

Редактировать : Как отмечено @mu ниже, Ruby 1.9's uniq также работает:

items.uniq{|h| [h[:replationship_1], h[:value]] }
3 голосов
/ 13 марта 2012

group_by{ |item| [item.relationship_1, item.value] }.values.map(&:first)?

ОБНОВЛЕНИЕ

Упс, это был хэш:

group_by{ |item| [item[:relationship_1], item[:value]] }.values.map(&:first)

или

group_by{ |item| item.values_at(:relationship_1, :value) }.values.map(&:first)

1 голос
/ 13 марта 2012

Может быть эта функция поможет. Я нашел это упомянутое в этой теме , и если я не ошибаюсь, это часть последнего ruby ​​на рельсах.

a.uniq_by {|t| [t.replationship_1, t.value]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...