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"
}
]

J'ai maintenant un tableau de [1,4,5] d'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 mieux gérer cela.

Je pense à créer un filtre personnalisé, mais quelle est votre opinion (si oui, veuillez fournir un exemple de code pour y parvenir).

Votre aide est appréciée.

Merci.

23
krsnaadi 5 mars 2016 à 20:48

6 réponses

Meilleure réponse

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 le callBack renvoie une valeur true, le itm transmis à ce callBack particulier sera filtré. Vous pouvez en savoir plus à ce sujet ici.

40
Preactive 16 nov. 2018 à 17:32

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>');
2
Nina Scholz 5 mars 2016 à 18:08

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' } ] ]
2
isvforall 5 mars 2016 à 18:15

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
Ashutosh Tripathy 5 mars 2016 à 19:06

En 2019 avec ES6:

const ids = [1, 4, 5],
  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"
    }]
  };


data.records = data.records.filter( i => ids.includes( i.empid ) );

console.info( data );
20
Tim Elsass 17 mai 2019 à 07:57

Dans le cas où vous avez des paires clé-valeur dans votre tableau d'entrée, j'ai utilisé:

.filter(
          this.multi_items[0] != null && store.state.isSearchBox === false
            ? item =>
                _.map(this.multi_items, "value").includes(item["wijknaam"])
            : item => item["wijknaam"].includes("")
        );

Où le tableau d'entrée est multi_items comme: [{"text": "bla1", "value": "green"}, {"text": etc. etc.}]

_.map est une fonction lodash.

0
Peter van der Lely 1 nov. 2019 à 16:54