Ruby: перебирать массив объектов, игнорировать элементы с дублирующимися атрибутами - PullRequest
4 голосов
/ 08 августа 2011

У меня есть массив объектов в ruby, и я хочу перебрать его, игнорируя каждый объект, имя которого уже было обработано.Например:

[
  #<Item name: "Item 1", content: "a">,
  #<Item name: "Item 1", content: "b">,
  #<Item name: "Item 2", content: "c">,
  #<Item name: "Item 3", content: "d">,
  #<Item name: "Item 3", content: "e">
]

Должно быть уменьшено до

[
  #<Item name: "Item 1">, # Should know that it belongs to content: "a" and "b"
  #<Item name: "Item 2">, # Should know that it belongs to content "c"
  #<Item name: "Item 3">  # Should know that it belongs to content: "d" and "e"
]

Возможное (но неприятное) решение:

processed = []
items.each do |item|
  next if processed.include?(item.name)
  processed << item.name
  # Output ...

Это не кажется очень простым дляя и так ищу альтернативу.Другим решением было бы хранить все в хэше и использовать имя в качестве индекса.Но это потребовало бы повторения дважды, и, похоже, не самое элегантное решение.Было бы здорово, если бы у кого-то была идея, как элегантно повторять.

С уважением, Себастьян

PS : Я только что понял, что все остальные предметы содин и тот же атрибут имени должен быть известен фактически обработанному элементу .Так что мое решение даже не сработает для этого.: - (

Ответы [ 2 ]

9 голосов
/ 08 августа 2011

Попробуйте это:

array.group_by(&:name).map{|k, v| v.first}
2 голосов
/ 08 августа 2011
a = [ "a", "a", "b", "b", "c" ]
a.uniq   #=> ["a", "b", "c"]
...