2014-07-10 3 views
0

J'ai tableau commetableau de carte avec état

strings = ["by_product[]=1", "by_product[]=2", "page=1", "per_page=10", "select[]=current", "select[]=requested", "select[]=original"] 

qui est un tableau de params de demande

Ensuite, il y a un code qui génère hachage du tableau

arrays = strings.map do |segment| 
     k,v = segment.split("=") 
     [k, v && CGI.unescape(v)] 
Hash[arrays] 

Sortie courant -

"by_product[]": "2", 
     "page":"1", 
     "per_page":"10", 
     "select[]":"original" 

Expiré mettre -

"by_product[]":"1, 2", 
     "page":"1", 
     "per_page":"10", 
     "select[]":"current, requested, original" 

Le problème est - après split méthode il y a quelques by_product[] et le dernier l'emporte sur tout autre juste params, donc en conséquence au lieu de hachage avec tableau en tant que valeur de ces params im obtenir que dernier. Et je ne suis pas sûr de savoir comment le réparer. Des idées? Ou au moins des algorithmes

+0

sortie attendue? –

+0

ajouté plus d'informations – Avdept

+0

Ce n'est pas valide Ruby .. Est-ce un Hash ou un tableau? –

Répondre

3

Donc, essayez ceci:

hash = {} 
arrays = strings.map do |segment| 
      k,v = segment.split("=") 
      hash[k]||=[] 
      hash[k] << v 
     end 

sortie est

1.9.3-p547 :025 > hash 
=> {"by_product[]"=>["1", "2"], "page"=>["1"], "per_page"=>["10"], "select[]"=>["current", "requested", "original"]} 

ou si vous voulez juste faire des chaînes

arrays = strings.map do |segment| 
      k,v = segment.split("=") 
      hash[k].nil? ? hash[k] = v : hash[k] << ", " + v 
     end 
+0

va essayer, et donner des commentaires – Avdept

+1

En supposant que les virgules sont importantes dans la sortie, je voudrais changer les deux lignes de hachage sur le second à 'hash [k] .nil? ? hash [k] = v: hash [k] << "," + v' personnellement –

+0

Oui, vous avez raison. @ Avdept, considérez le commentaire @ Baloo –

2

Ne pas réinventer la roue, CGI et Rack peut déjà gérer les chaînes de requête.

En supposant que votre tableau strings provient d'une seule chaîne de requête:

query = "by_product[]=1&by_product[]=2&page=1&per_page=10&select[]=current&select[]=requested&select[]=original" 

vous pouvez utiliser CGI::parse: (toutes les valeurs sous forme de tableaux)

require 'cgi' 

CGI.parse(query) 
#=> {"by_product[]"=>["1", "2"], "page"=>["1"], "per_page"=>["10"], "select[]"=>["current", "requested", "original"]} 

ou Rack::Utils.parse_query: (tableaux si nécessaire)

require 'rack' 

Rack::Utils.parse_nested_query(query) 
# => {"by_product[]"=>["1", "2"], "page"=>"1", "per_page"=>"10", "select[]"=>["current", "requested", "original"]} 

ou Rack::Utils.parse_nested_query: (valeurs sans [] suffixe)

require 'rack' 

Rack::Utils.parse_nested_query(query) 
# => {"by_product"=>["1", "2"], "page"=>"1", "per_page"=>"10", "select"=>["current", "requested", "original"]} 

Et si ceux-ci sont des paramètres pour un contrôleur Rails, vous pouvez juste use params.

1

cela travaillera également:

strings.inject({}){ |hash, string| 
    key, value = string.split('='); 
    hash[key] = (hash[key]|| []) << value; 
    hash; 
} 

sortie: {"by_product[]"=>["1", "2"], "page"=>["1"], "per_page"=>["10"], "select[]"=>["current", "requested", "original"]}

0

Aussi simple que cela

array.map { |record| record*3 if condition } 

enregistrement * 3 est l'opération qui en résulte que vous voulez faire au tableau en cartographie