按打字稿或javascript中的值过滤对象

时间:2021-07-29 06:44:44

标签: javascript typescript

我有一个对象 JobAffiliation,想通过 JobAffiliationEnum 过滤掉它 前任。我想要 JobAffiliation 分别用于 JobAffiliationEnum.AdminPortal 和 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,
    ...
}

谢谢

3 个答案:

答案 0 :(得分:1)

首先,我们可以使用 Object.keys 来获取 JobAffiliation 对象键的数组,然后通过与 JobAffiliationEnum 值中的一个相等来过滤它们,最后使用 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[])

答案 1 :(得分:1)

假设 JobAffiliation 是一个有效的 JSON,例如:

const JobAffiliation = {
    "JobTypeEnum.Job1": "JobAffiliationEnum.AdminPortal",
    "JobTypeEnum.Job2": "JobAffiliationEnum.EmployeePortal",
    "JobTypeEnum.Job3": "JobAffiliationEnum.AdminPortal | JobAffiliationEnum.EmployeePortal",
    ...
}

你可以这样写:

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"}]

答案 2 :(得分:1)

您可以使用 Object.entries 来登记键值对,然后按值过滤它们,然后使用 Object.fromEntries 从这些条目构建新对象:

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

(v & f) === f 测试值 v 具有标志 f。并注意标志值必须是 2 的幂。