/** * 枚举类 * Enum.IMAGE.name => "图片" * Enum.getNameByKey('IMAGE') => "图片" * Enum.getValueByKey('IMAGE') => 10 * Enum.getNameByValue(10) => "图片" * Enum.getData() => [{key: "IMAGE", name: "图片", value: 10}] */ class Enum { constructor (param) { const keyArr = [] const valueArr = [] if (!Array.isArray(param)) { throw new Error('param is not an array!') } param.map(element => { if (!element.key || !element.name) { return } // 保存key值组成的数组,方便A.getName(name)类型的调用 keyArr.push(element.key) valueArr.push(element.value) // 根据key生成不同属性值,以便A.B.name类型的调用 this[element.key] = element if (element.key !== element.value) { this[element.value] = element } }) // 保存源数组 this.data = param this.keyArr = keyArr this.valueArr = valueArr // 防止被修改 // Object.freeze(this) } // 根据key得到对象 keyOf (key) { return this.data[this.keyArr.indexOf(key)] } // 根据key得到对象 valueOf (key) { return this.data[this.valueArr.indexOf(key)] } // 根据key获取name值 getNameByKey (key) { const prop = this.keyOf(key) if (!prop) { throw new Error('No enum constant' + key) } return prop.name } // 根据value获取name值 getNameByValue (value) { const prop = this.valueOf(value) if (!prop) { throw new Error('No enum constant' + value) } return prop.name } // 根据key获取value值 getValueByKey (key) { const prop = this.keyOf(key) if (!prop) { throw new Error('No enum constant' + key) } return prop.key } // 返回源数组 getData () { return this.data } } export default Enum