Guide discord.js
Informations supplémentaires

Collections

discord.js est livré avec une classe utilitaire connue sous le nom de Collection. Elle étend la classe native Map de JavaScript, donc elle a toutes les caractéristiques de Map et plus !

Si vous n'êtes pas familier avec Map, lisez la page MDN sur celui-ci avant de continuer. Vous devriez être familier avec les méthodes Array aussi. Nous utiliserons également certaines caractéristiques ES6, donc lisez ici si vous ne savez pas ce qu'elles sont.

Une Map permet une association entre des clés uniques et leurs valeurs. Par exemple, comment pouvez-vous transformer chaque valeur ou filtrer les entrées dans une Map facilement ? C'est le but de la classe Collection !

Méthodes de type tableau

Beaucoup de méthodes sur Collection correspondent à leur homonyme dans Array. L'une d'elles est find :

// Supposons que nous ayons un tableau d'utilisateurs et une collection des mêmes utilisateurs.
array.find((u) => u.discriminator === '1000'); 
collection.find((u) => u.discriminator === '1000');

L'interface de la fonction callback est très similaire entre les deux. Pour les tableaux, les callbacks passent généralement les paramètres (value, index, array), où value est la valeur sur laquelle on itére, index est l'index courant et array est le tableau. Pour les collections, vous auriez (value, key, collection). Ici, value est le même, mais key est la clé de la valeur, et collection est la collection elle-même à la place.

Les méthodes qui suivent cette philosophie de rester proche de l'interface Array sont les suivantes :

  • find
  • filter - Notez que cela retourne une Collection plutôt qu'un Array.
  • map - Cependant, cela retourne un Array de valeurs au lieu d'une Collection !
  • every
  • some
  • reduce
  • concat
  • sort

Conversion en tableau

Puisque Collection étend Map, c'est un itérable, et peut être converti en Array via soit Array.from() soit la syntaxe de propagation (...collection).

// Pour les valeurs.
Array.from(collection.values());
[...collection.values()];

// Pour les clés.
Array.from(collection.keys());
[...collection.keys()];

// Pour les paires [clé, valeur].
Array.from(collection);
[...collection];

Beaucoup de gens convertissent les Collections en Arrays bien trop souvent !

Cela peut conduire à du code inutile et confus. Avant d'utiliser Array.from() ou similaire, demandez-vous si ce que vous essayez de faire ne peut pas être fait avec les méthodes données de Map ou Collection ou avec une boucle for-of. Ne pas être familier avec une nouvelle structure de données ne devrait pas signifier que vous transformez par défaut en l'autre.

Il y a généralement une raison pourquoi une Map ou une Collection est utilisée. La plupart des structures dans Discord peuvent être identifiées par un id, ce qui s'associe bien aux associations clé -> valeur comme dans les Maps.

Utilitaires supplémentaires

Certaines méthodes ne viennent pas de Array et sont plutôt entièrement nouvelles au JavaScript standard.

// Une valeur aléatoire.
collection.random();

// La première valeur.
collection.first();

// Les 5 premières valeurs.
collection.first(5);

// Similaire à `first`, mais à partir de la fin.
collection.last();
collection.last(2);

// Supprime tout ce qui satisfait la condition de la collection.
// Similaire à `filter`, mais en place.
collection.sweep((user) => user.username === 'Bob');

Une méthode plus compliquée est partition, qui divise une seule Collection en deux nouvelles Collections en fonction de la fonction fournie. Vous pouvez la penser comme deux filters, mais faits en même temps (et donc beaucoup plus performant) :

// `bots` est une Collection d'utilisateurs où leur propriété `bot` était vraie.
// `humans` est une Collection où la propriété était fausse à la place !
const [bots, humans] = collection.partition((u) => u.bot); 

// Les deux retournent vrai.
bots.every((b) => b.bot);
humans.every((h) => !h.bot); // notez l'opérateur "not" !