Por qué paginar
Un listado puede tener miles de elementos. Devolverlos todos es lento y caro. La solución estándar es exponer parámetros en la query string que el cliente combina para pedir justo lo que necesita.
Filtrado
Filtrar reduce la colección a los que cumplen una condición:
// GET /productos?categoria=libros
let lista = productos;
if (req.query.categoria) {
lista = lista.filter((p) => p.categoria === req.query.categoria);
}
Ordenación
sort indica el campo, con un - delante para descendente (?sort=-precio).
El comparador debe devolver 0 en los empates (si no, el orden se vuelve
inestable) y funcionar igual con números y con texto:
// GET /productos?sort=precio o ?sort=-precio (descendente)
if (req.query.sort) {
const desc = req.query.sort.startsWith("-");
const campo = desc ? req.query.sort.slice(1) : req.query.sort;
lista = [...lista].sort((a, b) => {
if (a[campo] < b[campo]) return desc ? 1 : -1;
if (a[campo] > b[campo]) return desc ? -1 : 1;
return 0; // empate: mantienen su orden
});
}
Paginación
Con page (página, empezando en 1) y limit (tamaño de página) calculas el
corte del array con slice:
// GET /productos?page=2&limit=10
const page = Number(req.query.page) || 1;
const limit = Number(req.query.limit) || 10;
const inicio = (page - 1) * limit;
const pagina = lista.slice(inicio, inicio + limit);
res.json({ page, limit, total: lista.length, datos: pagina });
El orden habitual es: filtrar → ordenar → paginar. Así paginas sobre el resultado ya filtrado y ordenado.