Я чувствую, что это может быть улучшено (общее чувство в рубине). Я пытаюсь uniq массив хэшей на основе значения. В этом примере я хочу цвета элементов. Мосс и снег - обманщики.
# remove unique array of hashes based on a hash value
a = [
{ :color => "blue", :name => "water" },
{ :color => "red", :name => "fire" },
{ :color => "white", :name => "wind" },
{ :color => "green", :name => "earth" },
{ :color => "green", :name => "moss" },
{ :color => "white", :name => "snow" }
]
# remove moss and snow
uniques = []
a.each_with_index do |r, i|
colors = uniques.collect {|e| e[:color]}
if !colors.include? r[:color]
uniques.push r
else
a[i] = nil
end
end
a.compact!
puts a
Откроется
{:color=>"blue", :name=>"water"}
{:color=>"red", :name=>"fire"}
{:color=>"white", :name=>"wind"}
{:color=>"green", :name=>"earth"}
Что является "правильным", однако я чувствую, что это чрезмерно. Мой опыт с .map.inject ограничен, и эти передовые методы ускользают от меня. Если кто-то может изменить это, это может помочь мне понять еще одну технику.