Paresh Bijarane
Paresh Bijarane

Reputation: 145

Filter object by value in typescript or javascript

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

Answers (3)

ishaba
ishaba

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

Eldar
Eldar

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

TS Playground

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

Giovanni Esposito
Giovanni Esposito

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

Related Questions