2009-11-05 3 views
1
myArray = [{"papers"=>[[1,2,3],[1,3,2]], "value"=>"1"}, 
      {"papers"=>[[2,1,3],[2,3,1]], "value"=>"1"}, 
      {"papers"=>[[1,2,3],[1,3,2]], "value"=>"0.5"}] 

je dois fusionner le contenu en fonction de la « valeur » de chaque tableau contenu, de sorte que je me retrouve avec quelque chose comme ceci:Comment fusionner le contenu des tableaux de hash (touches et contenu) dans Ruby

myArray = [{"papers"=>[[1,2,3],[1,3,2],[2,1,3],[2,3,1]], "value"=>"1"}, 
      {"papers"=>[[1,2,3],[1,3,2]], "value"=>"0.5"}] 

Comment le ferais-je de la manière Ruby? Je pensais à l'itération sur le tableau, et à la création d'un nouveau tableau basé sur les valeurs, mais je continue à faire des nœuds pour essayer de définir ce qui est copié.

+0

Pensé à créer juste un hachage comme "1" => [...], "0.5" => [...]? Si vous n'avez aucun attribut supplémentaire dans le tableau, cela facilite beaucoup la fusion des deux. –

+0

Yup, je peux le faire Edwin, pourriez-vous montrer comment cela aiderait? – Les

Répondre

4
>> myArray = [{"papers"=>[[1,2,3],[1,3,2]], "value"=>"1"}, 
?>   {"papers"=>[[2,1,3],[2,3,1]], "value"=>"1"}, 
?>   {"papers"=>[[1,2,3],[1,3,2]], "value"=>"0.5"}] 

>> hash = Hash.new {|h,k| h[k] = []} 

>> myArray.each {|entry| hash[entry['value']] += entry['papers']} 

>> hash 
=> {"1"=>[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1]], "0.5"=>[[1, 2, 3], [1, 3, 2]]} 

>> hash.map {|k,v| {"value" => k, "papers" => v}} 
=> [{"value"=>"1", "papers"=>[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1]]}, {"value"=>"0.5", "papers"=>[[1, 2, 3], [1, 3, 2]]}] 
+0

Merci Martin - c'était parfait. – Les

Questions connexes