Cette question est similaire à celle-ci tableau de filtre Jquery d'objet avec boucle mais cette fois, je dois faire le filtre avec un tableau d'objets.
Exemple:
J'ai un tableau d'objets comme celui-ci:
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"
}
...]
Je veux le filtrer avec un tableau comme celui-ci:
myFilter = [
{
userid: "101",
projectid: "11"
},
{
userid: "102",
projectid: "12"
},
{
userid: "103",
projectid: "11"
}]
et renvoyez ceci (l'ID utilisateur et l'ID projet dans myFilter doivent correspondre à l'ID utilisateur et à l'ID projet dans myArray):
myArrayFiltered = [
{
userid: "101",
projectid: "11",
rowid: "1"
},
{
userid: "102",
projectid: "12",
rowid: "2"
}]
Comment puis je faire ça ?
var filtered = [];
for(var arr in myArray){
for(var filter in myFilter){
if(myArray[arr].userid == myFilter[filter].userid && myArray[arr].projectid == myFilter[filter].projectid){
filtered.Push(myArray[arr].userid);
}
}
}
console.log(filtered);
Vous pouvez mettre ici quelques méthodes de tableau à utiliser - filter
et some
. Ils sont disponibles dans tous les navigateurs récents et des polyfills sont disponibles pour les anciens navigateurs.
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);
Avec le script Ecma 6.
const myArrayFiltered = myArray.filter( el => {
return myfilter.some( f => {
return f.userid === el.userid && f.projectid === el.projectid;
});
});
Fonction:
const filterObjectArray = (arr, filterArr) => (
arr.filter( el =>
filterArr.some( f =>
f.userid === el.userid && f.projectid === el.projectid
)
)
);
console.log(filterObjectArray(myArray, myFilter))
Vous devez faire une boucle sur votre premier tableau, et à l'intérieur de cette boucle, boucle à nouveau à l'intérieur du filtre.
Si userid et projectid sont égaux, vous pouvez ajouter la ligne à votre tableau filtré:
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"
}];
myFilter = [{
userid: "101",
projectid: "11"
}, {
userid: "102",
projectid: "12"
}, {
userid: "103",
projectid: "11"
}];
function filterArray(array, filter) {
var myArrayFiltered = [];
for (var i = 0; i < array.length; i++) {
for (var j = 0; j < filter.length; j++) {
if (array[i].userid === filter[j].userid && array[i].projectid === filter[j].projectid) {
myArrayFiltered.Push(array[i]);
}
}
}
return myArrayFiltered;
}
myArrayFiltered = filterArray(myArray, myFilter);
console.log(myArrayFiltered);
Ce code correspondra non seulement à userid et projectid mais à toutes les propriétés de myFilter [j].
var filtered = myArray.filter(function(i){
return myFilter.some(function(j){
return !Object.keys(j).some(function(prop){
return i[prop] != j[prop];
});
});
});
console.log(filtered);
Vous pouvez donc utiliser
myFilter = [
{
projectid: "11"
},
{
userid: "101"
},
{
userid: "103",
projectid: "13",
rowid: "3"
}
];
Reviendra
[ { userid: '101', projectid: '11', rowid: '1' },
{ userid: '103', projectid: '13', rowid: '3' },
{ userid: '101', projectid: '10', rowid: '4' } ]
Ce qui signifie que tous les éléments avec
(projectid=="11")
OR (userid=="101")
OR ( (userid=="103") AND (projectid=="13") AND (rowid=="3") )
basé sur @Renato sa réponse, mais plus court:
const myArray = [{ userid: "100", projectid: "10", rowid: "0" }, ...];
const myFilter = [{ userid: "101", projectid: "11" }, ...];
const myArrayFiltered = myArray.filter(array => myFilter.some(filter => filter.userid === array.userid && filter.projectid === array.projectid));
Vous pouvez utiliser jquery map, cela retourne un tableau de correspondances:
var _filter=function(arr_data,arr_filter){
return $.map( arr_data, function( n ) {
for(var f in arr_filter){
if(arr_filter[f].userid == n.userid && arr_filter[f].projectid == n.projectid){
return n;
}
}
});
}
var resp = _filter(myArray,myFilter);
console.log(resp);
Si un filtre comme celui-ci est nécessaire, je proposerais de créer un dictionnaire (objet) dont la clé est un hachage d'attributs qui définit une correspondance (dans ce cas, userid et projectid) de cette façon, vous devez itérer sur le 1er dict (meule de foin) pour vérifier si la clé est disponible dans le 2ème dict (aiguille). J'espère que cela t'aides.