I have an array model as below:
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"
}
]
Now I have an array of empid's [1,4,5]
.
So now I need to filter the first array which contains all the keys in my second.
Output:
records:[{
"empid":1,
"fname": "X",
"lname": "Y"
},
{
"empid":4,
"fname": "C",
"lname": "Y"
},
{
"empid":5,
"fname": "C",
"lname": "Y"
}
]
I can do this using a forEach
loop in angular
but as I have more than 100 records in my model object. I need a suggestion on how to handle this in much better way.
I am thinking of creating a custom filter, but what is your take on it.(If yes please provide sample code to achieve this).
This question is related to
javascript
angularjs
angular-filters
In 2019 using ES6:
const ids = [1, 4, 5],_x000D_
data = {_x000D_
records: [{_x000D_
"empid": 1,_x000D_
"fname": "X",_x000D_
"lname": "Y"_x000D_
}, {_x000D_
"empid": 2,_x000D_
"fname": "A",_x000D_
"lname": "Y"_x000D_
}, {_x000D_
"empid": 3,_x000D_
"fname": "B",_x000D_
"lname": "Y"_x000D_
}, {_x000D_
"empid": 4,_x000D_
"fname": "C",_x000D_
"lname": "Y"_x000D_
}, {_x000D_
"empid": 5,_x000D_
"fname": "C",_x000D_
"lname": "Y"_x000D_
}]_x000D_
};_x000D_
_x000D_
_x000D_
data.records = data.records.filter( i => ids.includes( i.empid ) );_x000D_
_x000D_
console.info( data );
_x000D_
In case you have key value pairs in your input array, I used:
.filter(
this.multi_items[0] != null && store.state.isSearchBox === false
? item =>
_.map(this.multi_items, "value").includes(item["wijknaam"])
: item => item["wijknaam"].includes("")
);
where the input array is multi_items as: [{"text": "bla1", "value": "green"}, {"text": etc. etc.}]
_.map is a lodash function.
You can use Array#filter
function and additional array for storing sorted values;
var recordsSorted = []
ids.forEach(function(e) {
recordsSorted.push(records.filter(function(o) {
return o.empid === e;
}));
});
console.log(recordsSorted);
Result:
[ [ { empid: 1, fname: 'X', lname: 'Y' } ],
[ { empid: 4, fname: 'C', lname: 'Y' } ],
[ { empid: 5, fname: 'C', lname: 'Y' } ] ]
Fastest way (will take extra memory):
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)
});
This is a fast solution with a temporary object.
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" }],_x000D_
empid = [1, 4, 5],_x000D_
object = {},_x000D_
result;_x000D_
_x000D_
records.forEach(function (a) {_x000D_
object[a.empid] = a;_x000D_
});_x000D_
_x000D_
result = empid.map(function (a) {_x000D_
return object[a];_x000D_
});_x000D_
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
_x000D_
Old way of doing it. Many might hate this way of doing but i still many time find this is still better in my perspective.
Input:
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 newArr = [1,4,5];
Code:
var newObj = [];
for(var a = 0 ; a < records.length ; a++){
if(newArr.indexOf(records[a].empid) > -1){
newObj.push(records[a]);
}
}
The indexOf() method returns the first index at which a given element can be found in the array, or -1 if it is not present.
Reference - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
Output:
[{
"empid": 1,
"fname": "X",
"lname": "Y"
}, {
"empid": 4,
"fname": "C",
"lname": "Y"
}, {
"empid": 5,
"fname": "C",
"lname": "Y"
}]
Source: Stackoverflow.com