2009-09-23 4 views
4

Je crois que cela a déjà été demandé/répondu dans un contexte légèrement différent, et j'ai vu des réponses à quelques exemples similaires - mais rien ne semble vraiment correspondre .Ruby: Créer un hachage avec les clés par défaut + les valeurs d'un tableau

J'ai un tableau d'adresses e-mail:

@emails = ["[email protected]", "[email protected]"] 

Je veux créer un hachage de ce tableau, mais il doit ressembler à ceci:

input_data = {:id => "#{id}", :session => "#{session}", 
       :newPropValues => [{:key => "OWNER_EMAILS", :value => "[email protected]"} , 
           {:key => "OWNER_EMAILS", :value => "[email protected]"}] 

Je pense que le Array de Hash à l'intérieur du hachage me rejette. Mais je l'ai joué avec inject, update, merge, collect, map et ai eu aucune chance de générer ce type de dynamique hachage qui doit être créé en fonction du nombre d'entrées dans le tableau @emails.

Quelqu'un a-t-il des suggestions sur la façon de s'en sortir?

Répondre

8

Donc, fondamentalement, votre question est comme ceci:

ayant ce tableau:

emails = ["[email protected]", "[email protected]", ....] 

Vous voulez un tableau de hachages comme ceci:

output = [{:key => "OWNER_EMAILS", :value => "[email protected]"},{:key => "OWNER_EMAILS", :value => "[email protected]"}, ...] 

Une solution serait:

emails.inject([]){|result,email| result << {:key => "OWNER_EMAILS", :value => email} } 

Mise à jour: bien sûr nous pouvons le faire de cette façon:

emails.map {|email| {:key => "OWNER_EMAILS", :value => email} } 
+2

inject est sans aucun doute la meilleure solution –

+1

Ah ha! c'est comme ça que j'injecterais! Cela m'aide beaucoup. Non seulement cela résout mon problème, mais ça me fait comprendre d'injecter un peu mieux. Je vous remercie! –

+0

En effet injecter ou map_reduce dans d'autres langages est un moyen cool d'itérer une collection + d'appliquer une opération sur tous ses éléments et de déplacer le résultat partiel vers les éléments successeurs lors de l'itération. – khelll

Questions connexes