web-dev-qa-db-fra.com

Filtrer un tableau d'objets avec un autre tableau d'objets

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 ?

16
GtAntoine
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);
5
Renato Galvones

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);
33
Andy

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))

Lien vers l'exemple

7
Tabares

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);

JSFIDDLE

4
Magicprog.fr

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") )
2
Vladimir

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));
2
Ruben

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);
2
benny

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.

0
Djk