Filter array of objects based on another array in javascript
JavascriptArraysFilterJavascript Problem Overview
Given an array of objects :
people = [
{id: "1", name: "abc", gender: "m", age:"15" },
{id: "2", name: "a", gender: "m", age:"25" },
{id: "3", name: "efg", gender: "f", age:"5" },
{id: "4", name: "hjk", gender: "m", age:"35" },
{id: "5", name: "ikly", gender: "m", age:"41" },
{id: "6", name: "ert", gender: "f", age:" 30" },
{id: "7", name: "qwe", gender: "f", age:" 31" },
{id: "8", name: "bdd", gender: "m", age:" 78" },
]
And an array of wanted ids:
id_filter = [1,4,5,8]
How to filter array people
to return the target ids defined in id_filter
and of gender=m
?
Javascript Solutions
Solution 1 - Javascript
The simplest way to filter is to use the array's filter()
function, similar to this:
people.filter(person => id_filter.includes(person.id))
Solution 2 - Javascript
You can use array.filter()
with few conditions to get the output you want. Also i have corrected your JSON.
var filtered = people.filter(function(item) {
return id_filter.indexOf(item.id) !== -1 && item.gender==='m';
});
DEMO
var people =[
{ "id": 1, "name": "abc", "gender": "m","age": "15" },
{ "id": 2, "name": "a", "gender": "m", "age": "25" },
{ "id": 3,"name": "efg", "gender": "f","age": "5" },
{ "id": 4,"name": "hjk","gender": "m","age": "35" },
{ "id": 5, "name": "ikly","gender": "m","age": "41" },
{ "id": 6, "name": "ert", "gender": "f", "age": "30" },
{ "id": 7, "name": "qwe", "gender": "f", "age": "31" },
{ "id":8, "name": "bdd", "gender": "m", "age": " 8" }
];
var id_filter = [1,4,5,8];
var filtered = people.filter(function(item) {
return id_filter.indexOf(item.id) !== -1 && item.gender==='m';
});
console.log(filtered);
Solution 3 - Javascript
With Array.includes()
function:
var people = [
{id : "1", name : "abc", gender : "m", age :"15" }, {id : "2", name : "a", gender : "m", age :"25" },
{id : "3", name : "efg", gender : "f", age :"5" }, {id : "4", name : "hjk", gender : "m", age :"35" },
{id : "5", name : "ikly", gender : "m", age :"41" }, {id : "6", name : "ert", gender : "f", age :" 30" },
{id : "7", name : "qwe", gender : "f", age :" 31" }, {id : "8", name : "bdd", gender : "m", age :" 78" }
],
id_filter = [1,4,5,8],
result = people.filter((o) => id_filter.includes(+o.id) && o.gender == "m");
console.log(result);
+o.id
-+
is used here to cast a numeric string into number
Solution 4 - Javascript
You can achieve that by the following code:
const filtered_people = people.filter(function(person){
return id_filter.includes(person.id) && person.gender === 'm';
});
Just make sure the id for each person is an integer and not an string, as in your example. Otherwise, the includes() function won't match. Also, your people
array has internal syntax problems. So, the final code would look like this:
const people = [
{id: 1, name: "abc", gender: "m", age:15},
{id: 2, name: "a", gender: "m", age: 25},
{id: 3, name: "efg", gender: "f", age: 5},
{id: 4, name: "hjk", gender: "f", age: 35},
{id: 5, name: "ikly", gender: "m", age: 41},
{id: 6, name: "ert", gender: "f", age: 30},
{id: 7, name: "qwe", gender: "f", age: 31},
{id: 8, name: "bdd", gender: "m", age: 78}
]
const id_filter = [1,4,5,8]
const filtered_people = people.filter((person) => id_filter.includes(person.id) && person.gender === 'm')
console.log(filtered_people)
I hope this helps you. Good luck.
Solution 5 - Javascript
For this case you can make use of filter and include function, since you id's are string,it need to be parse before use.
var result = people.filter((person) => (id_filter.includes(parseInt(person.id)) && person.gender ==='m'))
Solution 6 - Javascript
in this case it makes more sense to do this by foot
so first you need to iterate through your people
array
then you check if a persons id is equal to your filter list
for(person in people) {
for(id in id_filter) {
if(person[id] == id && person[gender] == "m"){
}
}
}
Solution 7 - Javascript
You can use Array.prototype.filter
like:
function filter(arr, ids, gender) { // takes an array of people arr, an array of indexes ids, and a gender and return the matched people objects from arr
return arr.filter(function(obj) { // filtering each object...
return ids.includes(obj.id) && obj.gender === gender; // if this object is is included in the ids array and if its gender property is equal to the desired gender
});
}
var people = [{id:"1",name:"abc",gender:"m",age:"15"},{id:"2",name:"a",gender:"m",age:"25"},{id:"3",name:"efg",gender:"f",age:"5"},{id:"4",name:"hjk",gender:"m",age:"35"},{id:"5",name:"ikly",gender:"m",age:"41"},{id:"6",name:"ert",gender:"f",age:"30"},{id:"7",name:"qwe",gender:"f",age:"31"},{id:"8",name:"bdd",gender:"m",age:"78"}];
console.log(filter(people, ["5", "7", "4"], "m")); // filtering elements where id is one of ["5", "7", "4"] and the gender is "m".
Note: The id
property of the objects in people
are strings so you have to either provides an array of string ids to filter
or convert the id
property to a number before passing it to includes
.
Solution 8 - Javascript
const people = [
{id: "1", name: "abc", gender: "m", age: "15" },
{id: "2", name: "a", gender: "m", age: "25" },
{id: "3", name: "efg", gender: "f", age: "5" },
{id: "4", name: "hjk", gender: "m", age: "35" },
{id: "5", name: "ikly", gender: "m", age: "41" },
{id: "6", name: "ert", gender: "f", age: " 30" },
{id: "7", name: "qwe", gender: "f", age: " 31" },
{id: "8", name: "bdd", gender: "m", age: " 78" },
]
const idFilter = [1,4,5,8]
const idIsInList = id => idFilter.includes(+id) // "+id" to make sure it is a number, not a string
const genderIsMale = gender => gender === "m"
const result = people.filter(item => idIsInList(item.id) && genderIsMale(item.gender))
console.log(result)
Solution 9 - Javascript
If your id_filter
is large, you would want to first convert it to a new Set()
. This will allow for constant-time lookup. You can then iterate your people
array using .filter()
and return true
if your set .has()
the id
in it and if the gender is equal to 'm'
.
const people = [ {id: "1", name: "abc", gender: "m", age:"15" }, {id: "2", name: "a", gender: "m", age:"25" }, {id: "3", name: "efg", gender: "f", age:"5" }, {id: "4", name: "hjk", gender: "m", age:"35" }, {id: "5", name: "ikly", gender: "m", age:"41" }, {id: "6", name: "ert", gender: "f", age:" 30" }, {id: "7", name: "qwe", gender: "f", age:" 31" }, {id: "8", name: "bdd", gender: "m", age:" 78" }, ];
const id_filter = new Set([1,4,5,8]);
const res = people.filter(({id, gender}) => id_filter.has(+id) && gender === 'm');
console.log(res);
Overall, the time complexity for this approach will be O(N + k)
as opposed to the O(Nk)
you would get if you were using the .includes()
or .indexOf()
approach, where N
is the length of the people
array, and k
is the length of the id_filter
array
Solution 10 - Javascript
people = [
{id : "1", name : "abc", gender : "m", age :"15" },
{id : "2", name : "a", gender : "m", age :"25" },
{id : "3", name : "efg", gender : "f", age :"5" },
{id : "4", name : "hjk", gender : "m", age :"35" },
{id : "5", name : "ikly", gender : "m", age :"41" },
{id : "6", name : "ert", gender : "f", age :" 30" },
{id : "7", name : "qwe", gender : "f", age :" 31" },
{id : "8", name : "bdd", gender : "m", age :" 78" }
]
var id_filter = ["1","4","5","8"], filteredPeople = [];
for( var i=people.length-1; i>=0; --i){
if( id_filter.indexOf( people[i].id ) != -1 ){
filteredPeople.push( people[i] );
}
}
console.log( filteredPeople );