wake-up-neo.net

So filtern Sie das Array, wenn sich der Objektschlüsselwert im Array befindet

Ich habe ein Array-Modell wie folgt:

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

Jetzt habe ich ein Array von Empids [1,4,5].

Jetzt muss ich das erste Array filtern, das alle Schlüssel in meinem zweiten enthält.

Ausgabe:

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

Ich kann dies mit einer forEach-Schleife in angular tun, aber da ich mehr als 100 Datensätze in meinem Modellobjekt habe. Ich brauche einen Vorschlag, wie ich damit viel besser umgehen kann.

Ich denke daran, einen benutzerdefinierten Filter zu erstellen, aber wie sehen Sie das? (Wenn ja, geben Sie bitte Beispielcode an, um dies zu erreichen).

Deine Hilfe wird wertgeschätzt.

Vielen Dank.

7
krsnaadi

Sie können es mit Array.prototype.filter() tun,

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

Wenn callBack einen true-Wert zurückgibt, wird die an itm übergebene callBack herausgefiltert. Sie können mehr darüber lesen hier .

2019 mit 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 );
10
Tim Elsass

Schnellster Weg (benötigt zusätzlichen Speicherplatz):

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

Sie können die Array#filter-Funktion und ein zusätzliches Array zum Speichern sortierter Werte verwenden.

var recordsSorted = []

ids.forEach(function(e) {
    recordsSorted.Push(records.filter(function(o) {
        return o.empid === e;
    }));
});

console.log(recordsSorted);

Ergebnis:

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

Dies ist eine schnelle Lösung mit einem temporären Objekt.

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