Tengo una lista de objetos en el siguiente formato.
let information = [ { data: { list: [ 'item1', 'item4', 'item5'], } }, { data: { list: [ 'item100', 'item200', 'item300'], } }, { data: { list: [ 'item1', 'item2', 'item3'], } }, { data: { list: [ 'item70', 'item71', 'item300'], } } ]Tengo una lista dinámica proveniente de otra selección que podría tener este aspecto.
const dynamicList = ['item1', 'item71'];Deseo filtrar objetos de la información donde hay al menos 1 coincidencia en comparación con la lista dinámica.
Entonces, en el ejemplo anterior, después de filtrar, debería quedarme con solo 3 elementos.
Solo el segundo elemento no tiene ni item1 ni el elemento item71 , por lo que los 3 restantes son una coincidencia.
Intenté lo siguiente para filtrar.
Pero el resultado es 4, por lo que no se filtró nada. El segundo dato no tiene elemento 1 en su lista.
¿Por qué no se ha filtrado? Por favor aconséjame. Gracias.
console.log(information.length); // 4 information = information .filter(info => info.data.list !== null) .filter(info => info.data.list .filter(item => dynamicList.includes(item))); console.log(information.length); // still 4, should be 3PD: el código anterior se puede pegar en la consola de un navegador para probarlo.
Puede filtrar los elementos cuya lista contiene al menos un elemento de dynamicList usando .some .some() :
let information = [ { data: { list: [ 'item1', 'item4', 'item5'], } }, { data: { list: [ 'item100', 'item200', 'item300'], } }, { data: { list: [ 'item1', 'item2', 'item3'], } }, { data: { list: [ 'item70', 'item71', 'item300'], } } ]; const dynamicList = ['item1', 'item71']; let filteredList = information.filter(info => info.data.list.some(el => dynamicList.includes(el))); console.log(filteredList);Esta puede ser una posible solución para lograr el objetivo deseado:
Fragmento de código
const filterUsing = (dlist, iarr) => ( iarr.filter( ({data : { list }}) => list && list.some(x => dlist.some(y => x === y)) ) ); // instead of dlist.some(y => x === y), may also use dlist.includes(x) const information = [{ data: { list: ['item1', 'item4', 'item5'], } }, { data: { list: ['item100', 'item200', 'item300'], } }, { data: { list: ['item1', 'item2', 'item3'], } }, { data: { list: ['item70', 'item71', 'item300'], } } ]; const dynamicList = ['item1', 'item71']; console.log('filtered-array:', filterUsing(dynamicList, information)); console.log('length: ', filterUsing(dynamicList, information).length);Explicación
filterUsing toma dos parámetros: dlist (Lista dinámica) e iarr (matriz de información).filter() en iarriarr para acceder a data.listsome elemento en la list que esté presente en dlist .