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