49 votes

Convertir un tableau de tableaux à 2 éléments en un hachage, où les clés en double ajoutent des valeurs supplémentaires

Par exemple

Étant donné un tableau :

 array = [[:a,:b],[:a,:c],[:c,:b]]

Renvoie le hachage suivant :

 hash = { :a => [:b,:c] , :c => [:b] }

hash = Hash[array] écrase les associations précédentes, produisant :

 hash = { :a => :c , :c => :b }

3voto

Ian Points 216

Cela peut être fait assez succinctement en utilisant each_with_object .

 array.each_with_object({}) { |(k, v), h| h[k] = (h[k] || []) + [v] }

Démonstration en irb :

 irb(main):002:0> array = [[:a,:b],[:a,:c],[:c,:b]]
=> [[:a, :b], [:a, :c], [:c, :b]]
irb(main):003:0> array.each_with_object({}) { |(k, v), h| h[k] = (h[k] || []) + [v] }
=> {:a=>[:b, :c], :c=>[:b]}

1voto

khiav reoy Points 478

Ce type d'opérations est très courant dans notre projet, nous avons donc ajouté to_group_h à Enumerable . Nous pouvons l'utiliser comme :

 [[:x, 1], [:x, 2], [:y, 3]].to_h
# => { x: 2, y: 3 }

[[:x, 1], [:x, 2], [:y, 3]].to_group_h
# => { x: [1, 2], y: [3] }

Voici l'implémentation de Enumerable#to_group_h :

 module Enumerable
  if method_defined?(:to_group_h)
    warn 'Enumerable#to_group_h is defined'
  else
    def to_group_h
      hash = {}
      each do |key, value|
        hash[key] ||= []
        hash[key] << value
      end
      return hash
    end
  end
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X