2014-02-19 3 views
0

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

{ «geo_locations» => { «страны» => ["US", "GB", "AR"]}, "genders => [1, 2]}

Таким образом, вышеуказанное предназначало бы всем пользователям в этих кодах стран и всех полов. простая версия хэша. Она может включать в себя еще много ключей со своим собственным набором значений.

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

{ "geo_locations" => { "страна" => [ "США"]}, «полы => [1 ]}

{ "geo_locations" => { "страна" => [ "GB"]}, "полы => [1]}

{" geo_locations "=> {" страна "=> [ "АР"]}, "= полы> [1]}

{" geo_locations "=> {" страна "=> [" США "]}" = полы> [2]}

{"geo_locations" => {"countries" => ["GB"]}, "genders => [2]}

{" geo_locations "=> {" countries "=> [" AR "]} , «= полы> [2]}

до сих пор я играл с различными идеями, такими как ходьба через хэш и извлечение каждого значения ключей в плоский массив, а затем применяя метод Array.product, чтобы генерировать все возможные перестановки, но до сих пор я зашел в тупик. Является ли декартовым продуктом даже правильное решение для вышеуказанного? Может быть, есть еще один встроенный рубиновый метод, чтобы позаботиться об этом, о котором я сейчас не знаю!

+0

Массив # продукт походит на правильный путь. – Linuxios

+1

Вы уверены, что хотите перестановки? Похоже, вы ищете комбинации. – sawa

+2

Что делает '1' обнаженным, а' [2] 'и страны заключены в скобки? – sawa

ответ

1

я сделаю

hash = {"geo_locations"=>{"countries"=>["US", "GB", "AR"]}, "genders" =>[1, 2]} 
countries = hash["geo_locations"]["countries"] 
genders = hash['genders'] 

array_of_hashes = countries.product(genders).map do |val1,val2| 
    {"geo_locations" => { "countries" => val1 }, "genders" => [val2] } 
end 
array_of_hashes 
# => [{"geo_locations"=>{"countries"=>"US"}, "genders"=>[1]}, 
#  {"geo_locations"=>{"countries"=>"US"}, "genders"=>[2]}, 
#  {"geo_locations"=>{"countries"=>"GB"}, "genders"=>[1]}, 
#  {"geo_locations"=>{"countries"=>"GB"}, "genders"=>[2]}, 
#  {"geo_locations"=>{"countries"=>"AR"}, "genders"=>[1]}, 
#  {"geo_locations"=>{"countries"=>"AR"}, "genders"=>[2]}] 
+0

@steenslag Конечно .. Я действительно сделал что-то еще и забыл удалить это. Спасибо за указатель .. Я его обновил. –

Смежные вопросы