Colecciones
discord.js viene con una clase de utilidad conocida como Collection
. Extiende la clase nativa Map
de JavaScript, por lo que tiene todas las características de Map
y más.
ADVERTENCIA
Si no estás familiarizado con Map
, lee su página en MDNopen in new window antes de continuar. También deberías estar familiarizado con los métodos
de Arrayopen in new window. También usaremos algunas características de ES6, así que lee aquí si no sabes lo que son.
Un Mapa
permite una asociación entre claves únicas y sus valores. Por ejemplo, ¿cómo transformar fácilmente cada valor o filtrar las entradas de un Map
? Este es el objetivo de la clase Collection
.
Métodos tipo array
Muchos de los métodos de Collection
se corresponden con sus homónimos de Array
. Uno de ellos es find
:
// Supongamos que tenemos un array de usuarios y una colección de los mismos usuarios.
array.find(u => u.discriminator === '1000');
collection.find(u => u.discriminator === '1000');
2
3
La interfaz de la función de devolución de llamada (callback) es muy similar entre los dos. Para los arrays, las retrollamadas suelen pasar los parámetros (value, index, array)
, donde value
es el valor iterado, index
es el índice actual, y array
es el array. Para colecciones, tendrías (value, key, collection)
. Aquí, value
es lo mismo, pero key
es la clave del valor, y collection
es la colección en sí.
Los métodos que siguen esta filosofía de permanecer cerca de la interfaz Array
son los siguientes:
find
filter
- Ten en cuenta que devuelve unaCollection
en lugar de unArray
.map
- Devuelve unArray
de valores en lugar de unaCollection
.every
some
reduce
concat
sort
Convirtiendo a Array
Dado que Collection
extiende Map
, es un iterableopen in new window, y puede convertirse en un Array
mediante Array.from()
o la sintaxis spread (...collection
).
// Para valores.
Array.from(collection.values());
[...collection.values()];
// Para claves.
Array.from(collection.keys());
[...collection.keys()];
// Para pares [clave, valor].
Array.from(collection);
[...collection];
2
3
4
5
6
7
8
9
10
11
ADVERTENCIA
Mucha gente convierte colecciones en arrays con demasiada frecuencia. Esto puede dar lugar a código innecesario y confuso. Antes de utilizar Array.from()
o similar, pregúntate si lo que estás intentando hacer no se puede hacer con los métodos Map
o Collection
o con un bucle for-of.
Utilidades extra
Algunos métodos no proceden de Array
, sino que son completamente nuevos en JavaScript estándar.
// Un valor aleatorio.
collection.random();
// El primer valor.
collection.first();
// Los primeros cinco valores.
collection.first(5);
// Similar a `first`, pero desde el fin.
collection.last();
collection.last(2);
// Elimina de la colección todo lo que cumpla la condición.
// Algo así como `filter`, pero en el lugar.
collection.sweep(user => user.username === 'Bob');
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Un método más complicado es partition
, que divide una única Colección en dos nuevas Colecciones basándose en la función proporcionada. Se puede pensar que son dos filtros
, pero hechos al mismo tiempo:
// `bots` es una colección de usuarios cuya propiedad `bot` es verdadera.
// `humans` es una Colección donde la propiedad era falsa en su lugar.
const [bots, humans] = collection.partition(u => u.bot);
// Ambos devuelven verdadero.
bots.every(b => b.bot);
humans.every(h => !h.bot);
2
3
4
5
6
7