AdventJS 2021 — Reto 1: Ovejas rojas con «a» y «n»
Filtra un array de ovejas por color rojo y por nombre que incluya las letras a y n. Solución con filter, every e includes; enlace al código en GitHub y al video en TikTok.
El primer reto del AdventJS 2021 no pide contar booleanos: pide filtrar objetos en un array. Cada oveja tiene name y color; debes quedarte solo con las de color rojo cuyo nombre contenga las dos letras a y n (da igual el orden, mayúsculas o espacios en el nombre).
Enunciado resumido
- Entrada: array de
{ name, color }. - Salida: array con las ovejas que cumplan ambas condiciones:
colores rojo (comparación prudente con el texto del reto).- El
nameincluyeay incluyen.
Ejemplo del propio reto: de una lista de varias ovejas rojas, solo califican Navidad y Ki Na Ma; Euge no es roja, AAAAAaaaaa no tiene n, Nnnnnnnn no tiene a.
Estrategia
- Recorrer solo las que interesan con
filter. - Para el color, normalizar con
toLowerCase()y comparar con'rojo'. - Para el nombre, trabajar en minúsculas y comprobar que
aynestén presentes. Una forma clara es un array['a', 'n']yeverysobreincludes: así obligas a que existan las dos letras sin escribir dos condiciones largas repetidas.
Solución (repo)
Esta es la versión que tengo en el repositorio adventjs21 (archivo 01-conteo-ovejas.js):
export default function contarOvejas(ovejas) {
return ovejas.filter(({ name, color }) =>
color.toLowerCase() === 'rojo' &&
['a', 'n'].every((letra) => name.toLowerCase().includes(letra))
);
}
{ name, color }— desestructuración en el callback defilter; el código se lee alineado con la forma de cada oveja.color.toLowerCase() === 'rojo'— evita fallos si el reto mezcla mayúsculas.['a', 'n'].every(...)— documenta la regla del enunciado (“debe tener ambas”) y escala mejor si un día piden más letras.
Por qué no basta con un solo includes
Si solo buscaras la subcadena "an", fallarías con nombres válidos como “Ki Na Ma”, donde las letras están separadas. Por eso conviene exigir cada letra por separado.
Variante equivalente
Si prefieres no usar every:
const lower = name.toLowerCase();
return lower.includes('a') && lower.includes('n');
Misma lógica; elige la que te resulte más legible en equipo o en entrevistas.
Video en TikTok
En este video resumo el reto y la idea de la solución en formato corto. Arriba en la cabecera del artículo también tienes el enlace Ver en TikTok para abrirlo rápido.
Recursos
- Reto 1 — AdventJS 2021 (enunciado y tests en el editor).
- Código en GitHub.
AdventJS es una buena excusa para practicar filter, condiciones sobre strings y lectura fina del enunciado: aquí la “trampa” era la pareja de letras, no el array en sí.