2013-10-07 4 views
6

У меня есть массив хэшей следующим образом:Удаление хэш из массива хэшей в Ruby,

[{"k1"=>"v1", "k2"=>"75.1%"}, {"k1"=>"v2", "k2"=>"-NA-"}, {"k1"=>"v3", "k2"=>"5.1%"}] 

Теперь я хочу сначала проверить, содержит ли массив хэш с ключом "k1" со значением "v3". Если да, то я хочу удалить этот хэш из массива.

Результат должен быть:

[{"k1"=>"v1", "k2"=>"75.1%"}, {"k1"=>"v2", "k2"=>"-NA-"}] 

ответ

28

Использование Array#delete_if:

arr = [{"k1"=>"v1", "k2"=>"75.1%"}, {"k1"=>"v2", "k2"=>"-NA-"}, {"k1"=>"v3", "k2"=>"5.1%"}] 

arr.delete_if { |h| h["k1"] == "v3" } 
#=> [{"k1"=>"v1", "k2"=>"75.1%"}, {"k1"=>"v2", "k2"=>"-NA-"}] 

Если нет хэш соответствие условию, массив остается неизменным.

+0

Что делать, если я хочу сделать что-то в случай else, т. е. h ["k1"]! = "v3". Как мы это делаем? – Hellboy

+0

@Hellboy 'arr.keep_if {| h | h ["k1"]! = "v3"} 'будет работать – Stefan

+0

Спасибо. Он должен работать! – Hellboy

10

Вы можете сделать это с Array#reject (Если вы не хотите, чтобы изменить приемник) , а также с Array#reject! (Если вы хотите изменить приемник)

arr = [{"k1"=>"v1", "k2"=>"75.1%"}, {"k1"=>"v2", "k2"=>"-NA-"}, {"k1"=>"v3", "k2"=>"5.1%"}] 
p arr.reject { |h| h["k1"] == "v3" } 
# >> [{"k1"=>"v1", "k2"=>"75.1%"}, {"k1"=>"v2", "k2"=>"-NA-"}]  

arr = [{"k1"=>"v1", "k2"=>"75.1%"}, {"k1"=>"v2", "k2"=>"-NA-"}, {"k1"=>"v3", "k2"=>"5.1%"}] 
p arr.reject! { |h| h["k1"] == "v3" } 
# >> [{"k1"=>"v1", "k2"=>"75.1%"}, {"k1"=>"v2", "k2"=>"-NA-"}] 
Смежные вопросы