Búsqueda de sitios web

javascript - ¿Podemos usar la función .filter() con reglas condicionales para las propiedades buscadas?


Supongamos que tenemos la siguiente función .filter:

search(searchQuery: string) {
  let results = myArray.filter(item => 
    item.title.toLowerCase().includes(searchQuery) ||
    item.description.toLowerCase().includes(searchQuery)
  );

  return results;
}

Para este ejemplo podemos considerar que item no siempre tiene una propiedad description, sino solo algunas veces. En este caso, la función fallará con un error:

ERROR TypeError: No se puede leer la propiedad 'toLowerCase' de undefined

¿Cómo podemos seguir buscando en el array e incluir la propiedad description en la búsqueda solo si existe? ¿Es esto posible dentro de la función .filter()?

Respuesta #1

Podrías tomar un valor predeterminado.

Ya sea directamente

(item.description || '').toLowerCase().includes(searchQuery)

o tomar una desestructuración con valores predeterminados.

results = myArray.filter(({ title = '', description = '' }) => 
    title.toLowerCase().includes(searchQuery) ||
    description.toLowerCase().includes(searchQuery)
);

Respuesta #2

Puedes hacer algo así:

const myArray = [
    {
        title: 'Test 123',
    },
    {
        title: 'Test 123',
        description: 'test',
    },
    {
        title: 'What',
    },
    {
        title: 'Fix',
        description: '456123',
    },
];

const search = (text) => {
    let results = myArray.filter(item => {
        if (item.description) {
            return item.title.toLowerCase().includes(text) || item.description.toLowerCase().includes(text);
        }
    });
  
    return results;
}

const results = search('test');

console.log(results);