Filtrar conjunto de objetos con otro conjunto de objetos
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 ?
Puede utilizar un par de métodos de matriz aquí: filter
y 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);
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));
result
contiene all masterData
except filterData
.
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
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.some
expresión verifica si hay al menos un elemento en la myFilter
matriz que tenga la condición que establecimos ( filterEl.userid === arrayEl.userid && filterEl.projectid === arrayEl.projectid
)
Si hay uno, regresa true
y myArray.filter
mantendrá esa entrada en la matriz resultante; de lo contrario, se filtrará.