JavaScript通过枚举实现优化if...else的实现办法

本文介绍了如何通过函数和ES6枚举优化状态显示,从原始的if...elseif结构转变为更简洁的枚举实现。此外,还展示了如何定义一个Enum类来管理和操作枚举值,提供了更加灵活和易于维护的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、问题场景

function getDeploy(state) {
    let result = '';
    if(state == 'NOTSTARTED') {
        result = '未开始'
    } else if(state == 'LOADING') {
        result = '进行中'
    } else if(state == 'NOTCOMPLETED') {
        result = '未完成'
    } else if(state == 'FINISHED') {
        result = '已完成'
    } else {
        result = ''
    }
    return result;
}
console.log(getDeploy('NOTSTARTED')) // 未开始

2、ES6枚举实现

可以看到上面通过一个函数用来获取一个发布状态,并把英文转成中文用于前端界面显示。
不过是采用了大量的if ... else if实现的,我们可以换一种方式来实现。

const EnumDeploy = Object.freeze({
    'NOTSTARTED'   : Symbol('未开始'),
    'LOADING'      : Symbol('进行中'),
    'NOTCOMPLETED' : Symbol('未完成'),
    'FINISHED'     : Symbol('已完成')
})
console.log(EnumDeploy.NOTSTARTED); // Symbol(未开始)

这里采用了ES6官方的示例实现了枚举。
在这里插入图片描述

3、项目中定义Enum类实现

class Enum {
    constructor(arr) {
        let typeArr = [];
        if (!Array.isArray(arr)) throw new Error('arr is not an Array!');
        arr.map(element => {
            if (!element.state || !element.name) return;
            // 保存state值组成的数组,方便A.getName(name)类型的调用
            typeArr.push(element.state);
            // 根据state生成不同属性值,以便A.B.name类型的调用
            this[element.state] = element;
        });
        // 保存源数组
        this.arr = arr;
        this.typeArr = typeArr;
    }
    // 根据state得到对象
    valueOf(state) {
        return this.arr[this.typeArr.indexOf(state)];
    }
    // 根据state获取name值
    getNameByState(state) {
        let prop = this.valueOf(state);
        if (!prop) throw new Error('No enum constant' + state);
        return prop.name;
    }
    // 返回源数组
    getValues() {
        return this.arr;
    }
}

const DeployStatusEnum = new Enum([
    { state: 'NOTSTARTED',  name: '未开始' },
    { state: 'LOADING',     name: '进行中' },
    { state: 'NOTFINISHED', name: '未完成' },
    { state: 'FINISHED',    name: '已完成' }
]);

console.log(DeployStatusEnum.LOADING.name);  // 进行中
console.log(DeployStatusEnum.getNameByState('FINISHED'));  //已完成
console.log(DeployStatusEnum.getValues());  // [{ state: '未开始', name: '未开始' }, { state: '进行中', name: '进行中' }, { state: '未完成', name: '未完成' }, { state: '已完成', name: '已完成' }, { state: '失败', name: '失败' }]

类实现参考文章 -> ES6实现枚举类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmallTeddy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值