I wonder if there is a more elegant way of doing this. Suppose i have an array of objects like this:
a = [
{
"id": "kpi02",
"value": 10
},
{
"id": "kpi02",
"value": 30
},
{
"id": "kpi02",
"value": 11
},
{
"id": "kpi02",
"value": 33
},
{
"id": "kpi03",
"value": 1
},
{
"id": "kpi03",
"value": 0.5
},
{
"id": "kpi04",
"value": 0.5
}
]
Now i want to filter on the id
property, to return all objects with a match in another array
var kpis = ["kpi03", "kpi02"];
I came up with this solution:
var b = [];
for (j in kpis) {
for (i in a) {
if (a[i].id == kpis[j]) {
b.push(a[i]);
}
}
}
Coming from R, this seems a bit complicated, is there any way to do that with the filter
prototype? Like this but with an array of strings to compare with instead of a single string:
var b = a.filter( function(item){return (item.id == "kpi03");} );
Thanks a lot!
Just make use of Array.indexOf
var b = a.filter(function(item){return kpids.indexOf(item.id) > -1 });
Array.indexOf
returns the index of the argument passed in the array on which indexOf
is being called on. It returns -1
if there isn't the element which we are looking for.
So, we make sure that it index is greater than -1
If you want them in the order of the array of string then
var result = [];
kpis.map((item) => {
const matchedObject = a.find(
(option) => option.id === item
);
result.push(matchedObject);
});
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.