Estoy tratando de filtrar una matriz de objetos Javascript con objetos anidados con propiedades específicas. Puedo filtrar el nombre, slug, sitio web, año de lanzamiento sin ningún problema. Pero no puedo filtrar el nombre de la categoría (category.name) que es un objeto dentro del objeto. ¿Por qué no funciona el filtrado del nombre de la categoría?
var search = "qui"; // does not work (category.name) // var search = "Sauer"; // works (name) var data = [{ "name": "Sauer-Metz", "slug": "ab-laborum", "website": "https://test.com", "launch_year": 2017, "category_id": 6, "category": { "id": 6, "name": "qui", "slug": "qui" } } ]; var results = data.filter(company => [ 'name', 'launch_year', 'website', 'category.name' ].some(key => String(company[key]).toLowerCase().includes(search.toLowerCase()))); console.log(results);Una forma de hacerlo es tener un extractor de value como el getKey continuación
const getKey = (value, key) => { return key.split('.').reduce((acc, curr) => value[curr], ''); } var results = data.filter(company => [ 'name', 'launch_year', 'website', 'category.name' ].some(key => String(getKey(company, key)).toLowerCase().includes(search.toLowerCase())));Creo que debe hacer una condición separada para esta propiedad anidada específica, aunque podría haber una forma más limpia que no veo en este momento:
var results = data.filter( (company) => ["name", "launch_year", "website"].some((key) => String(company[key]).toLowerCase().includes(search.toLowerCase()) ) || String(company["category"]["name"]) .toLowerCase() .includes(search.toLowerCase()) );La notación de puntos no funciona así.
const testCase1 = 'qui'; const testCase2 = 'Sauer'; const data = [ { name: 'Sauer-Metz', slug: 'ab-laborum', website: 'https://test.com', launch_year: 2017, category_id: 6, category: { id: 6, name: 'qui', slug: 'qui' }, }, ]; const searchResults = (data, search) => { return data.filter((item) => { return ( item?.category?.name.toLowerCase().includes(search.toLowerCase()) || ['name', 'launch_year', 'website'].some((key) => `${item[key]}`.toLowerCase().includes(search.toLowerCase())) ); }); }; console.log('**CASE 1**') console.log(searchResults(data, testCase1)); console.log('**CASE 2**') console.log(searchResults(data, testCase2));