因为实际业务中有需求,利用ES6实现了一个枚举类,可以实现A.B.name的使用需求
class EsEnum {
constructor(arr) {
let typeArr = [];
if (!Array.isArray(arr)){
throw 'arr is not an array!';
return;
}
arr.map(element => {
if(!element.code || !element.name) {
return;
}
// 保存code值组成的数组,方便A.getName(name)类型的调用
typeArr.push(element.code);
// 根据code生成不同属性值,以便A.B.name类型的调用
this[element.code] = element;
});
// 保存源数组
this.arr = arr;
this.typeArr = typeArr;
}
// 根据code得到对象
valueOf(code) {
return this.arr[this.typeArr.indexOf(code)];
}
// 根据code获取name值
getNameByCode(code){
let prop = this.valueOf(code);
if (!prop){
throw 'No enum constant' + code;
return;
}
return prop.name;
}
// 返回源数组
getValues() {
return this.arr;
}
}
export default EsEnum;
使用方式
const ResourceStatusEnum = new EsEnum([
{code: 'WAIT_APPROVE', name: "未审核"},
{code: 'ENABLED', name: '启用'},
{code: 'REFUSED', name: '审核未通过'},
{code: 'DISABLED', name: '停用'}
]);
console.log(ResourceStatusEnum.ENABLED.name); // 启用
console.log(ResourceStatusEnum.getNameByCode('ENABLED')); //启用
console.log(ResourceStatusEnum.getValues());
/*
[ { code: 'WAIT_APPROVE', name: '未审核' },
{ code: 'ENABLED', name: '启用' },
{ code: 'REFUSED', name: '审核未通过' },
{ code: 'DISABLED', name: '停用' } ]
*/