Filtrar conjunto de objetos con otro conjunto de objetos

Resuelto GtAntoine asked hace 9 años • 11 respuestas

Esta pregunta es similar a esta matriz de objeto de filtro Jquery con bucle , pero esta vez necesito hacer el filtro con una matriz de objetos.

Ejemplo:

Tengo una variedad de objetos como este:

myArray = [
{
    userid: "100", 
    projectid: "10",
    rowid: "0"
},
{
    userid: "101", 
    projectid: "11",
    rowid: "1"},
{    
    userid: "102", 
    projectid: "12",
    rowid: "2"},
{    
    userid: "103", 
    projectid: "13",
    rowid: "3"
},
{    
    userid: "101", 
    projectid: "10",
    rowid: "4"
}
...]

Quiero filtrarlo con una matriz como esta:

myFilter = [
{
    userid: "101", 
    projectid: "11"
},
{
    userid: "102", 
    projectid: "12"
},
{
    userid: "103", 
    projectid: "11"
}]

y devuelva esto (el ID de usuario y el ID de proyecto en myFilter deben coincidir con el ID de usuario y el ID de proyecto en myArray):

myArrayFiltered = [
{
    userid: "101", 
    projectid: "11",
    rowid: "1"
},
{
    userid: "102", 
    projectid: "12",
    rowid: "2"
}]

Cómo puedo hacer eso ?

GtAntoine avatar Jun 23 '15 21:06 GtAntoine
Aceptado

Puede utilizar un par de métodos de matriz aquí: filtery some. Están disponibles en todos los navegadores recientes y hay polyfills disponibles para los navegadores más antiguos.

const myArray = [{ userid: "100", projectid: "10", rowid: "0" }, { userid: "101", projectid: "11", rowid: "1"}, { userid: "102", projectid: "12", rowid: "2" }, { userid: "103", projectid: "13", rowid: "3" }, { userid: "101", projectid: "10", rowid: "4" }];
const myFilter = [{ userid: "101", projectid: "11" }, { userid: "102", projectid: "12" }, { userid: "103",  projectid: "11"}];

const myArrayFiltered = myArray.filter((el) => {
  return myFilter.some((f) => {
    return f.userid === el.userid && f.projectid === el.projectid;
  });
});

console.log(myArrayFiltered);
Expandir fragmento

Andy avatar Jun 23 '2015 14:06 Andy

En respuesta a la respuesta anterior de Andy , que creo que debería marcarse ahora como respuesta, si está buscando un comportamiento exactamente opuesto, use each con negación, algo como esto.

const result = masterData.filter(ad => 
             filterData.every(fd => fd.userid !== md.userid));

resultcontiene all masterData except filterData.

Triguna avatar Oct 16 '2020 19:10 Triguna

Con guión Ecma 6.

const myArrayFiltered = myArray.filter( el => {
  return myfilter.some( f => {
    return f.userid === el.userid && f.projectid === el.projectid;
  });
});

Función:

const filterObjectArray = (arr, filterArr) => (
    arr.filter( el =>
        filterArr.some( f =>
            f.userid === el.userid && f.projectid === el.projectid
        )
    )
);

console.log(filterObjectArray(myArray, myFilter))

Enlace al ejemplo

Tabares avatar Oct 17 '2017 21:10 Tabares

basado en @Renato su respuesta, pero más corta:

const myArray = [{ userid: "100", projectid: "10", rowid: "0" }, ...];
const myFilter = [{ userid: "101", projectid: "11" }, ...];

const data = myArray.filter((arrayEl) =>
  myFilter.some((filterEl) => filterEl.userid === arrayEl.userid && filterEl.projectid === arrayEl.projectid)
);

La myFilter.someexpresión verifica si hay al menos un elemento en la myFiltermatriz que tenga la condición que establecimos ( filterEl.userid === arrayEl.userid && filterEl.projectid === arrayEl.projectid)

Si hay uno, regresa truey myArray.filtermantendrá esa entrada en la matriz resultante; de ​​lo contrario, se filtrará.

Ruben avatar Dec 18 '2019 10:12 Ruben