web-dev-qa-db-fra.com

Comment filtrer un tableau lorsque la valeur de la clé d'objet est dans un tableau

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 un tableau de [1,4,5] de empid.

Alors maintenant, je dois filtrer le premier tableau qui contient toutes les clés de mon second.

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 dans 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 beaucoup mieux.

Je pense créer un filtre personnalisé, mais que pensez-vous de ce filtre (si oui, veuillez fournir un exemple de code pour y parvenir).

Votre aide est appréciée.

Merci.

7
krsnaadi

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.records.filter(function(itm){
  return empIds.indexOf(itm.empid) > -1;
});

filteredArray = { records : filteredArray };

Si callBack renvoie une valeur true, la itm transmise à cette callBack sera filtrée. Vous pouvez en lire plus à ce sujet ici .

Moyen le plus rapide (prendra de la mémoire supplémentaire):

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

Vous pouvez utiliser la fonction 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' } ] ]
1
isvforall

C'est 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>');

0
Nina Scholz