Comment filtrer un tableau d'objets javascript avec des paramètres variables

Je souhaite sélectionner les objets en fonction des propriétés des objets, mais pas toujours les mêmes propriétés. En d'autres termes:

arr = [ { name: "joe", age21: 1 }, { name: "nick", age21: 0 }, { name: "blast", age21: 1 } ]; arr.filter(function(item) { return (item.name === "nick" && item.age21 === 1); }); 

Mais parfois, je veux simplement filtrer sur le nom par exemple:

 arr.filter(function(item) { return (item.name === "nick"); }); 

Ce que je veux faire est de généraliser ceci afin que la liste des paramètres puisse être transmise à la fonction. J'ai trouvé ce qui suit, mais c'est lent et je me demande s'il y a une meilleure façon:

 filterParams = function(arr, params) { var new_array = arr.filter(function(item) { var select = 1 for(obj in params) { //create the filter criteria based on varying set of parameters var select = select && params[obj] === item[obj]; } return select; }); return new_array; } 

Ensuite, vous pouvez l'appeler avec: filterParams(arr, {name: "nick", age21: 1});

Ou avec: filterParams(arr, {name: "nick"});

Et cela fonctionnerait d'une manière ou d'une autre.

Dans le cas où vous vous demandez, je fais cela parce que j'ai des ensembles de données différents que je souhaite exécuter dans la même routine, de sorte que les propriétés du filtre doivent être généralisées afin que je puisse filtrer les propriétés spécifiques à chaque jeu de données.

Merci!

    Voici une approche fonctionnelle qui devrait fonctionner pour tout nombre de propriétés donné l'objet:

     function filter(arr, criteria) { return arr.filter(function(obj) { return Object.keys(criteria).every(function(c) { return obj[c] == criteria[c]; }); }); } 

    Par exemple:

     var arr = [ { name: 'Steve', age: 18, color: 'red' }, { name: 'Louis', age: 21, color: 'blue' }, //* { name: 'Mike', age: 20, color: 'green' }, { name: 'Greg', age: 21, color: 'blue' }, //* { name: 'Josh', age: 18, color: 'red' } ]; console.log(filter(arr, { age: 21, color: 'blue' })); //^ {age:21, color:'blue', name:'Louis} // {age:21, color:'blue', name:'Greg'} 

    Pas sûr de votre problème de performance, mais cela devrait être correct.

    Edit: Vous pourriez le rendre plus puissant avec des expressions régulières, quelque chose comme ceci:

     function filter(arr, criteria) { return arr.filter(function(obj) { return Object.keys(criteria).every(function(c) { return new RegExp(criteria[c]).test(obj[c]); }); }); } console.log(filter(arr, { age: /^2\d$/, color: /^(red|blue)$/ })); //^ Louis, Greg --^-- twenty-something // ----^---- red OR blue