Proyecto JavaScript Filtrar y buscar en base a diferentes campos

//Variables

//Campos del formulario
const marca = document.querySelector('#marca');
const year = document.querySelector('#year'); //El select donde voy a poner los años
const minimo = document.querySelector('#minimo');
const maximo = document.querySelector('#maximo');
const puertas = document.querySelector('#puertas');
const transmision = document.querySelector('#transmision');
const color = document.querySelector('#color');

//Contenedor para los resultados
const resultado = document.querySelector('#resultado'); //El div donde mostreré los datos y los resultados de las búsquedas

//Numeración de los últimos 10 años
const max = new Date().getFullYear(); //Método para obtener el año actual
const min = max - 10; //El años mínimo es el año máximo menos 10

//El objeto que se va a llena con los datos que seleccione el usuario
const datosBusqueda = {
    marca: '', 
    year: '', 
    minimo: '', 
    maximo: '', 
    puertas: '', 
    transmision: '', 
    color: ''
}

//Eventos
//Evento iniciar para cargar los datos completos en la lista
document.addEventListener('DOMContentLoaded', () => { //Preparo el código para que muestre todos los autos de la base de datos cuando cargue la página
    mostrarAutos(autos);                                   //En un proyecto anterior se usó el DOMCL para inicializar un formulario, cosa que tenía sentido, pero
                                                     //aquí por qué no mostrarlo por defaul (de alguna manera), o es eso lo q se está haciendo

    llenarYears();                      //Para llenar la lista de años de los autmóviles automáticamente
})

//Eventos cuando se seleccione algo en los selectores, todos mandarán a llamar a la función filtrarAuto y a colocar el valor en el objeto datosBusqueda
marca.addEventListener('change', e => {
    datosBusqueda.marca = e.target.value;
    filtrarAuto();
});      
year.addEventListener('change', e => {
    datosBusqueda.year = parseInt(e.target.value);
    filtrarAuto();
});
minimo.addEventListener('change', e => {
    datosBusqueda.minimo = e.target.value;
    filtrarAuto();
});
maximo.addEventListener('change', e => {
    datosBusqueda.maximo = e.target.value;
    filtrarAuto();
})
puertas.addEventListener('change', e => {
    datosBusqueda.puertas = parseInt(e.target.value);
    filtrarAuto();
})
transmision.addEventListener('change', e => {
    datosBusqueda.transmision = e.target.value;
    filtrarAuto();
})
color.addEventListener('change', e => {
    datosBusqueda.color = e.target.value;
    filtrarAuto();
})

//<<<<<<<Funciones>>>>>>>>>>
//Para mostrar los datos del arreglo auto al cargar la página
function mostrarAutos(autos) {         //Iterando sobre el array autos para mostrar un string párrafo (datosHTML) en el div resultado por cada dato objeto
                                        //El parámetro de la función tiene el mismo nombre del arreglo global que funciona como base de datos, pero podría ser otro
    limpiarHTML();
    
    autos.forEach( auto => { //Por cada dato del array auto
      const { marca, modelo, year, puertas, transmision, precio, color } = auto; //Crea estas variables a modo destructuring
      const datosHTML = document.createElement('p'); //Creame un html tipo párrafo y métele el siguiente texto usando las variables anteriores
      datosHTML.textContent = `${marca} ${modelo} -- ${year} - ${puertas} puertas - Transmisión: ${transmision} - Precio: ${precio} - Color: ${color} `;
      resultado.appendChild(datosHTML); //Móntame ese texto en el div resultado y vamos con el otro
    })
}

//Crear la lista de los últimos 10 años
function llenarYears() {
    for(i = max; i >= min; i-- ) { //itero sobre los años con los que estoy trabajando
        const optionYear = document.createElement('option'); //Creo el elemento html option que va a ir insertado en el select de años o years 
        optionYear.value = i;                   //Le asigno a cada uno el value del año 
        optionYear.textContent = i;             //Le asigno a cada uno el texto que es también el año, pero esto está en string y no number
        year.appendChild(optionYear);           //Meto eso en el select conrespondiente a los años
    }
}

function limpiarHTML() {  //Un método de limpieza clásico de elementos HTML
    while(resultado.firstChild) { //Mientras el querySelector indicado tenga hijos, borra el primer hijo hasta que ya no halla más hijos
        resultado.removeChild(resultado.firstChild);
    }
}

//Para filtrar el arreglo auto inicial en base a las selecciones en los campos de búsqueda
function filtrarAuto() { //Función de alto nivel, manda a llamar a otras funciones
    const resultado = autos.filter( filtrarMarca ).filter( filtrarYear ).filter( filtrarMinimo ).filter( filtrarMaximo ).filter( filtrarPuertas ).filter( filtrarTransmision ).filter( filtrarColor ); 
    // const resultado = autos.filter( datosAutos => datosAutos.marca === datosBusqueda.marca ); 
    // const resultado = autos.filter( datosAutos => datosAutos ); 
    
    console.log(resultado);
    
    if(resultado.length) {
        mostrarAutos(resultado); //Se llama la función y se le pasa ahora si otro arreglo con un nombre diferene a auto
    }else{
        noResultado();
    }  
}

function filtrarMarca(datosAutos) {
    const { marca } = datosBusqueda;
     if(marca) {
         return datosAutos.marca === marca;
     }
     return datosAutos;
}

function filtrarYear(datosAutos) {
    const { year } = datosBusqueda;
     if(year) {
         return datosAutos.year === year;
     }
     return datosAutos;
}

function filtrarMinimo(datosAutos) {
    const { minimo } = datosBusqueda;
    if(minimo) {
        return datosAutos.precio >= minimo; //Como no estamos en modo estricto el código puede comparar con operadores lógicos un string y un número
    }
    return datosAutos;
}

function filtrarMaximo(datosAutos) {
    const { maximo } = datosBusqueda;
    if(maximo) {
        return datosAutos.precio <= maximo;
    }
    return datosAutos;
}

function filtrarPuertas(datosAutos) {
    const { puertas } = datosBusqueda;
     if(puertas) {
         return datosAutos.puertas === puertas;
     }
     return datosAutos;
}

function filtrarTransmision(datosAutos) {
    const { transmision } = datosBusqueda;
     if(transmision) {
         return datosAutos.transmision === transmision;
     }
     return datosAutos;
}

function filtrarColor(datosAutos) {
    const { color } = datosBusqueda;
     if(color) {
         return datosAutos.color === color;
     }
     return datosAutos;
}

function noResultado() {

    limpiarHTML();

    const noResultado = document.createElement('div');
    noResultado.classList.add('alerta', 'error');
    noResultado.textContent = 'No hay resultados';
    resultado.appendChild(noResultado);
}

El arreglo que funciona como base de datos

const autos = [
	{
		marca: 'BMW',
		modelo: 'Serie 3',
		year: 2020,
		precio: 30000,
		puertas: 4,
		color: 'Blanco',
		transmision: 'automatico'
	},
	{ 
        marca: 'Audi', 
        modelo: 'A4', 
        year: 2020, 
        precio: 40000, 
        puertas: 4, 
        color: 'Negro', 
        transmision: 'automatico' 
    },
	{
		marca: 'Ford',
		modelo: 'Mustang',
		year: 2015,
		precio: 20000,
		puertas: 2,
		color: 'Blanco',
		transmision: 'automatico'
	},
	{ 
        marca: 'Audi', 
        modelo: 'A6', 
        year: 2020, 
        precio: 35000, 
        puertas: 4, 
        color: 'Negro', 
        transmision: 'automatico' 
    },
	{
		marca: 'BMW',
		modelo: 'Serie 5',
		year: 2016,
		precio: 70000,
		puertas: 4,
		color: 'Rojo',
		transmision: 'automatico'
	},
	{
		marca: 'Mercedes Benz',
		modelo: 'Clase C',
		year: 2015,
		precio: 25000,
		puertas: 4,
		color: 'Blanco',
		transmision: 'automatico'
	},
	{
		marca: 'Chevrolet',
		modelo: 'Camaro',
		year: 2018,
		precio: 60000,
		puertas: 2,
		color: 'Rojo',
		transmision: 'manual'
	},
	{ 
        marca: 'Ford', 
        modelo: 'Mustang', 
        year: 2019, 
        precio: 80000, 
        puertas: 2, 
        color: 'Rojo', 
        transmision: 'manual' 
    },
	{
		marca: 'Dodge',
		modelo: 'Challenger',
		year: 2020,
		precio: 40000,
		puertas: 4,
		color: 'Blanco',
		transmision: 'automatico'
	},
	{ 
        marca: 'Audi', 
        modelo: 'A3', 
        year: 2017, 
        precio: 55000, 
        puertas: 2, 
        color: 'Negro', 
        transmision: 
        'manual' 
    },
	{
		marca: 'Dodge',
		modelo: 'Challenger',
		year: 2020,
		precio: 25000,
		puertas: 2,
		color: 'Rojo',
		transmision: 'manual'
	},
	{
		marca: 'Mercedes Benz',
		modelo: 'Clase C',
		year: 2018,
		precio: 45000,
		puertas: 4,
		color: 'Azul',
		transmision: 'automatico'
	},
	{
		marca: 'BMW',
		modelo: 'Serie 5',
		year: 2019,
		precio: 90000,
		puertas: 4,
		color: 'Blanco',
		transmision: 'automatico'
	},
	{ 
        marca: 'Ford', 
        modelo: 'Mustang', 
        year: 2017, 
        precio: 60000, 
        puertas: 2, 
        color: 'Negro', 
        transmision: 'manual' 
    },
	{
		marca: 'Dodge',
		modelo: 'Challenger',
		year: 2015,
		precio: 35000,
		puertas: 2,
		color: 'Azul',
		transmision: 'automatico'
	},
	{
		marca: 'BMW',
		modelo: 'Serie 3',
		year: 2018,
		precio: 50000,
		puertas: 4,
		color: 'Blanco',
		transmision: 'automatico'
	},
	{
		marca: 'BMW',
		modelo: 'Serie 5',
		year: 2017,
		precio: 80000,
		puertas: 4,
		color: 'Negro',
		transmision: 'automatico'
	},
	{
		marca: 'Mercedes Benz',
		modelo: 'Clase C',
		year: 2018,
		precio: 40000,
		puertas: 4,
		color: 'Blanco',
		transmision: 'automatico'
	},
	{ 
        marca: 'Audi', 
        modelo: 'A4', 
        year: 2016, 
        precio: 30000, 
        puertas: 4, 
        color: 'Azul', 
        transmision: 'automatico' 
    }
];