Я бы выбрал методы массива reject
или select
:
require 'pp'
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" }
]
pp a.reject{ |h| %w[moss snow].include?( h[:name]) }
# >> [{:color=>"blue", :name=>"water"},
# >> {:color=>"red", :name=>"fire"},
# >> {:color=>"white", :name=>"wind"},
# >> {:color=>"green", :name=>"earth"}]
С другой стороны, вы можете быть уверены в этом и select
те, которые вы хотите сохранить:
pp a.select{ |h| %w[water fire wind earth].include?( h[:name] ) }
# >> [{:color=>"blue", :name=>"water"},
# >> {:color=>"red", :name=>"fire"},
# >> {:color=>"white", :name=>"wind"},
# >> {:color=>"green", :name=>"earth"}]
Вы на самом деле не имеете дело с хешами, это массив, который содержит хэши, поэтому не позволяйте им сбить вас с толку.Методы массива, такие как reject
и select
, являются основными методами фильтрации нежелательных или сохраняющих нужные элементы.
В вашем примере кода вы теряете из виду, какова ваша цель: вам нужны элементы, отвергая "мох" и "снег", которые не являются элементами.Отфильтруйте неэлементы, и вы останетесь с правильными / реальными элементами в хешах.Оттуда вы можете извлечь правильные цвета.
Еще одна проблема, за которой нужно следить при использовании uniq
, это то, что она позиционная, другими словами, она ищет первое уникальное значение и отклоняет последующие.Это не было очевидно в вашем коде, потому что ваш массив был в том же порядке, что вы тестировали.Если вы перетасовали заказ, хотя ...:
2.times do
pp a.shuffle.uniq{ |h| h[:color] }
end
Pass # 1 ...
# [{:color=>"red", :name=>"fire"},
# {:color=>"white", :name=>"wind"},
# {:color=>"green", :name=>"moss"},
# {:color=>"blue", :name=>"water"}]
Pass # 2 ...
# [{:color=>"green", :name=>"earth"},
# {:color=>"blue", :name=>"water"},
# {:color=>"red", :name=>"fire"},
# {:color=>"white", :name=>"snow"}]
Внезапномы видим, что и «мох», и «снег» подкрадываются к результатам, хотя цвета уникальны.Это тонкие хитрости, которые вы должны остерегаться.