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