it-swarm.com.ru

Как фильтровать массив, когда значение ключа объекта находится в массиве

У меня есть модель массива, как показано ниже:

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's [1,4,5].

Так что теперь мне нужно отфильтровать первый массив, который содержит все ключи в моем втором.

Результат:

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

Я могу сделать это с помощью цикла forEach в angular, но в моем объекте модели более 100 записей. Мне нужно предложение о том, как справиться с этим гораздо лучше.

Я думаю о создании пользовательского фильтра, но как вы к нему относитесь (если да, предоставьте пример кода для достижения этой цели).

Ваша помощь ценится.

Благодарю.

7
krsnaadi

Вы можете сделать это с помощью 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 };

Если callBack возвращает значение true, то itm, переданная этой конкретной callBack, будет отфильтрована. Вы можете прочитать больше об этом здесь .

24
Rajaprabhu Aravindasamy

Самый быстрый способ (займет больше памяти):

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

Вы можете использовать функцию Array#filter и дополнительный массив для хранения отсортированных значений;

var recordsSorted = []

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

console.log(recordsSorted);

Результат:

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

Это быстрое решение с временным объектом.

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