Reputation: 145
I have an object JobAffiliation and wanted to filter it out by JobAffiliationEnum ex. I want JobAffiliation separately for JobAffiliationEnum.AdminPortal and JobAffiliationEnum.EmployeePortal
enum JobAffiliationEnum {
AdminPortal = 1,
EmployeePortal = 2
}
enum JobTypeEnum {
Job1 = 1,
Job2 = 2,
Job3 = 3
}
const JobAffiliation = {
[JobTypeEnum.Job1] : JobAffiliationEnum.AdminPortal,
[JobTypeEnum.Job2] : JobAffiliationEnum.EmployeePortal,
[JobTypeEnum.Job3] : JobAffiliationEnum.AdminPortal | JobAffiliationEnum.EmployeePortal,
...
}
Thanks
Upvotes: 0
Views: 175
Reputation: 551
First we can use Object.keys
to get an array of JobAffiliation
object keys second filter them by equality to one of JobAffiliationEnum
value and finally build a new object with filtered keys with reduce.
const EmployeePortalKeys = Object.keys(JobAffiliation) as unknown as JobTypeEnum[]
const EmployeePortal = EmployeePortalKeys.filter((key)=> JobAffiliation[key] === JobAffiliationEnum.EmployeePortal)
.reduce((obj, key) => {
obj[key] = JobAffiliation[key];
return obj;
}, {} as JobTypeEnum[])
const AdminPortalKeys = Object.keys(JobAffiliation) as unknown as JobTypeEnum[]
const AdminPortal = AdminPortalKeys.filter((key)=> JobAffiliation[key] === JobAffiliationEnum.AdminPortal)
.reduce((obj, key) => {
obj[key] = JobAffiliation[key];
return obj;
}, {} as JobTypeEnum[])
Upvotes: 1
Reputation: 10790
You can use Object.entries
to enlist key value pairs and then filter them out by value and then use Object.fromEntries
to build the new object from that entries :
enum JobAffiliationEnum {
AdminPortal = 1,
EmployeePortal = 2
}
enum JobTypeEnum {
Job1 = 1,
Job2 = 2,
Job3 = 3
}
const JobAffiliation = {
[JobTypeEnum.Job1] : JobAffiliationEnum.AdminPortal,
[JobTypeEnum.Job2] : JobAffiliationEnum.EmployeePortal,
[JobTypeEnum.Job3] : JobAffiliationEnum.AdminPortal | JobAffiliationEnum.EmployeePortal
}
const filterValues = [JobAffiliationEnum.AdminPortal,JobAffiliationEnum.EmployeePortal];
const newObject = Object.fromEntries( Object.entries(JobAffiliation).filter(([k,v])=> filterValues.some( (f : number)=> (v & f) === f)))
console.log(newObject);
This (v & f) === f
tests the value v
has the flag f
. And beware that flag values have to be the power of 2.
Upvotes: 1
Reputation: 11176
Supposing that JobAffiliation
is a valid JSON like:
const JobAffiliation = {
"JobTypeEnum.Job1": "JobAffiliationEnum.AdminPortal",
"JobTypeEnum.Job2": "JobAffiliationEnum.EmployeePortal",
"JobTypeEnum.Job3": "JobAffiliationEnum.AdminPortal | JobAffiliationEnum.EmployeePortal",
...
}
You could write something like:
let AdminPortalArray = [];
let EmployeePortalArray = [];
Object.entries(JobAffiliation).forEach(job => {
if(job[1].includes("JobAffiliationEnum.AdminPortal")) AdminPortalArray.push(job);
else if (job[1].includes("JobAffiliationEnum.EmployeePortal")) EmployeePortalArray.push(job);
});
console.log(AdminPortalArray);
// this will show [{"JobTypeEnum.Job1": "JobAffiliationEnum.AdminPortal"}, {"JobTypeEnum.Job3": "JobAffiliationEnum.AdminPortal | JobAffiliationEnum.EmployeePortal"}]
console.log(EmployeePortalArray);
// this will show [{"JobTypeEnum.Job2": "JobAffiliationEnum.EmployeePortal"}, {"JobTypeEnum.Job3": "JobAffiliationEnum.AdminPortal | JobAffiliationEnum.EmployeePortal"}]
Upvotes: 1