Comment filtrer le tableau lorsque la valeur de la clé de l'objet est en ordre

J'ai un modèle de tableau comme ci-dessous:

records:[{ "empid":1, "fname": "X", "lname": "Y" }, { "empid":2, "fname": "A", "lname": "Y" }, { "empid":3, "fname": "B", "lname": "Y" }, { "empid":4, "fname": "C", "lname": "Y" }, { "empid":5, "fname": "C", "lname": "Y" } ] 

Maintenant, j'ai une série d'empid's [1,4,5] .

Alors maintenant, j'ai besoin de filtrer le premier tableau qui contient toutes les clés dans ma seconde.

Sortie:

 records:[{ "empid":1, "fname": "X", "lname": "Y" }, { "empid":4, "fname": "C", "lname": "Y" }, { "empid":5, "fname": "C", "lname": "Y" } ] 

Je peux le faire en utilisant une boucle forEach en angular mais comme j'ai plus de 100 enregistrements dans mon objet modèle. J'ai besoin d'une suggestion sur la façon de gérer cela de manière beaucoup mieux.

Je pense à créer un filtre personnalisé, mais qu'est-ce que vous en prenez. (Si oui, veuillez fournir un exemple de code pour y parvenir).

Votre aide est appréciée.

Merci.

Vous pouvez le faire avec Array.prototype.filter() ,

 var data = { records : [{ "empid": 1, "fname": "X", "lname": "Y" }, { "empid": 2, "fname": "A", "lname": "Y" }, { "empid": 3, "fname": "B", "lname": "Y" }, { "empid": 4, "fname": "C", "lname": "Y" }, { "empid": 5, "fname": "C", "lname": "Y" }] } var empIds = [1,4,5] var filteredArray = data.record.filter(function(itm){ return empIds.indexOf(itm.empid) > -1; }); filteredArray = { records : filteredArray }; 

Si le callBack renvoie une valeur true , alors l' itm passé à cet callBack particulier sera filtré. Vous pouvez en savoir plus à ce sujet ici .

Il s'agit d'une solution rapide avec un objet temporaire.

 var records = [{ "empid": 1, "fname": "X", "lname": "Y" }, { "empid": 2, "fname": "A", "lname": "Y" }, { "empid": 3, "fname": "B", "lname": "Y" }, { "empid": 4, "fname": "C", "lname": "Y" }, { "empid": 5, "fname": "C", "lname": "Y" }], empid = [1, 4, 5], object = {}, result; records.forEach(function (a) { object[a.empid] = a; }); result = empid.map(function (a) { return object[a]; }); document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>'); 

Vous pouvez utiliser la fonction de Array#filter et un tableau supplémentaire pour stocker les valeurs triées;

 var recordsSorted = [] ids.forEach(function(e) { recordsSorted.push(records.filter(function(o) { return o.empid === e; })); }); console.log(recordsSorted); 

Résultat:

 [ [ { empid: 1, fname: 'X', lname: 'Y' } ], [ { empid: 4, fname: 'C', lname: 'Y' } ], [ { empid: 5, fname: 'C', lname: 'Y' } ] ] 

Le moyen le plus rapide (prendra plus de mémoire):

 var empid=[1,4,5] var records = [{ "empid": 1, "fname": "X", "lname": "Y" }, { "empid": 2, "fname": "A", "lname": "Y" }, { "empid": 3, "fname": "B", "lname": "Y" }, { "empid": 4, "fname": "C", "lname": "Y" }, { "empid": 5, "fname": "C", "lname": "Y" }] ; var empIdObj={}; empid.forEach(function(element) { empIdObj[element]=true; }); var filteredArray=[]; records.forEach(function(element) { if(empIdObj[element.empid]) filteredArray.push(element) });