function createEnumItem(label, value, ...others) { if (others && others.length > 0 ){ return {label, value, others}; } return {label, value}; } function formatEnumObject(originEnumObject) { if (!originEnumObject || typeof originEnumObject !== "object") { return {}; } const enumObject = {}; const keys = Object.keys(originEnumObject); for (let i = 0; i < keys.length; i++) { const key = keys[i]; const item = originEnumObject[key]; if (typeof item === "string") { enumObject[key] = createEnumItem(item, key); } else if (typeof item === "object") { enumObject[key] = item; } } return enumObject; } function createEnum(originEnumObject) { const enumObject = formatEnumObject(originEnumObject); const NAMES = { KEY: '@@key', ITEM: '@@@item', }; const getItemAttr = (item, key, attrName)=>{ if (attrName === NAMES.KEY) { return key; } if (attrName === NAMES.ITEM) { return item; } return item[attrName]; } const getMapInner = (keyName, valueName) => { const map = {}; const keys = Object.keys(enumObject); for (let i = 0; i < keys.length; i++) { const key = keys[i]; const item = enumObject[key] || {}; const mapKeyPt = getItemAttr(item, key, keyName); map[mapKeyPt] = getItemAttr(item,key, valueName); } return map; } // 自带缓存,避免重复计算。 const cacheObject = {}; const getMap = (keyName, valueName) => { const cacheKey = `${keyName}_${valueName}`; if (!cacheObject[cacheKey]) { cacheObject[cacheKey] = getMapInner(keyName, valueName); } return cacheObject[cacheKey]; } return { getItems: () => { return Object.values(enumObject); }, getValueKeyMap: () => getMap('value', NAMES.KEY), getValueLabelMap: () => getMap('value', 'label'), getValueItemMap: () => getMap('value', NAMES.ITEM), getLabelValueMap: () => getMap('label', 'value'), getLabelKeyMap: () => getMap('label', NAMES.KEY), getLabelItemMap: () => getMap('label', NAMES.ITEM), getKeyValueMap: () => getMap(NAMES.KEY, 'value'), getKeyLabelMap: () => getMap(NAMES.KEY, 'label'), getKeyItemMap: () => getMap(NAMES.KEY, NAMES.ITEM), getMap, }; } var demo1 = createEnum({ PENDING: createEnumItem("处理中", "1"), AGREE: createEnumItem("已同意", "2"), REJECT: createEnumItem("已拒绝", "3"), FINISH: createEnumItem("已完成", "4"), CLOSED: createEnumItem("已关闭", "5"), }); var demo2 = createEnum({ PENDING: "处理中", AGREE: "已同意", REJECT: "已拒绝", FINISH: "已完成", CLOSED: "已关闭", }); var demo3 = createEnum({ PENDING1: {aa:"处理中1",bb:'1'}, PENDING2: {aa:"处理中2",bb:'2'}, PENDING3: {aa:"处理中3",bb:'3'}, PENDING4: {aa:"处理中4",bb:'4'}, }); demo3.getMap('bb','aa'); demo3.getMap('@@key','aa');