1 min read

Indexer un tableau en Ruby

Rails nous fournit plein d'outils pour nous aider dans notre quotidien de développeurs. En voici un nouvel exemple avec la méthode Enumerable#index_by

L’autre jour j’ai eu besoin de manipuler une liste A et pour chaque objet de cette liste je devais retrouver ses propriétés secondaires qui étaient stockées dans une autre liste B. Chacun des éléments de B comporte une référence à l’un des objets de la liste A.

my_users = [
  { id: 1, name: 'John Doe' }, 
  { id: 2, name: 'Jane Doe' }, 
  #...
]

users_addresses = [
  { user_id: 1, city: 'Paris' },
  { user_id: 2, city: 'London' },
  #...
]
Un exemple type des tableaux à ma disposition

En temps normal j’aurais du utiliser la méthode Enumerable#find mais chacune de mes listes contient beaucoup d’items et ça n’aurait pas été très performant de devoir parcourir mon tableau B pour chaque item de la liste A.

J’ai donc eu l’idée de transformer mon tableau B en Hash  dans lequel chaque clé sera l’identifiant d’un des objets de ma liste A. Ainsi la récupération d’un objet sera simplifiée, car il me suffira de faire my_hash[identifiant] pour récupérer les données qui m’intéresse.

J’ai commencé à convertir mon tableau comme j’ai l’habitude de le faire avec la méthode Enumerable#each_with_object comme j’avais l’habitude de faire :

users_addresses.each_with_object({}) do |item, memo|
  memo[item.id] = item
end

# => { 1: { user_id: 1, city: 'Paris' }, 2: { user_id: 2, city: 'London' }, ... }
Conversion d'un tableau avec la méthode Enumerable#each_with_object

C’est une fois que j’ai écrit ces quelques lignes que Rubocop m’a signaler que je pouvais utiliser directement la méthode Enumerable#index_by pour obtenir le même résultat. Il s’agit de l’une des nombreuses méthodes apportés par la gem activesupport afin d’étoffer la boite à outils à disposition des développeurs Ruby.

users_addresses.index_by { |item| item.id }

# => { 1: { user_id: 1, city: 'Paris' }, 2: { user_id: 2, city: 'London' }, ... }
Conversion d'un tableau avec la méthode Enumerable#index_by

Liens