2015-07-01 5 views
0

У меня есть следующий массив аргументов, который имеет хэш с ключами арг и их соответствующих переданных значений:рубин фильтрации массив хэш

args_array = [{:collection=>["abe", "<mus>", "hest"], :include_blank=>true, :required=>true}] 

Мне нужно фильтровать этот хэш, чтобы просто получить только некоторые клавиши (как : include_blank и: требуется) в этом примере, с их соответствующими значениями следующим образом:

filtered_args_hash = {:include_blank=>true, :required=>true} 

так collection агд исключается, и просто include_blank и required, в котором я указал те возвращаются.

Update:

Вот ключи массив символов, в которых мне нужно фильтровать по их:

filter_keys = %i(include_blank required) 

Как я могу это сделать?

+0

Да, ключи =% я (include_blank требуется) –

+0

Вопрос обновляется. –

ответ

0

Следующие должны делать решить вашу проблему:

args_array.collect {|a| a if a[:include_blank] == true && a[:required=>true] == true }.compact 

или

dup_list = args_array.dup 
dup_list.delete_if {|a| !(a[:include_blank] == true && a[:required=>true] == true) } 
+0

Но мне нужен include_blank и требуется вернуть с их значениями, являются ли они истинными или ложными или что-то еще. –

+0

Также проверьте, пожалуйста, вопрос. –

+0

Итак, вы хотите сгруппировать их с помощью include_blank и требуется? – Rubyrider

2

Один из способов заключается в использовании Hash#keep_if:

args_array[0].dup.keep_if {|k| filter_keys.include? k} 
# => {:include_blank=>true, :required=>true} 

Обратите внимание, что .dup здесь, чтобы предотвратить args_array от модификации d, не используйте его, если вы хотите обновить args_array.

+1

Это изменяет 'args_array [0]' хотя. Если я правильно понял вопрос, это поведение, похоже, не в порядке (может быть, так оно и есть). В этом случае можно использовать 'Hash # select'. – cremno

+1

@cremno Вы правы, обновляется сейчас. –

0
args_array.map do |elem| 
    elem.select do |k, _| 
    %i(include_blank required).include? k 
    end 
end 
1

Вы помечаются как Rails, так что вы можете использовать Hash#slice:

args_array[0].slice *filter_keys 
# => {:include_blank=>true, :required=>true} 
Смежные вопросы