2016-03-05 2 views
4

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

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].

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

Выход:

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

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

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

Ваша оценка оценена.

Спасибо.

+0

являются данные и идентификаторы отсортированные? –

+0

Нет, данные не отсортированы .. Решение Aravindsamy выглядит хорошо .. Спасибо, ребята, за быстрый ответ .. – krsnaadi

ответ

13

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

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

+0

Это очень просто и просто @ Rajaprabhu, но любая информация, связанная с производительностью, делая это на больших данных (около 500 -1000) length, – krsnaadi

+0

@KrishnaAditya Это очень похоже на цикл, внутренне данные будут повторяться с использованием для циклов, но эффективным способом. Это делает код более читабельным и поддерживаемым. –

0

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

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 – krsnaadi

1

Вы можете использовать функцию 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

быстрый способ (потребует дополнительной памяти):

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