代码优雅化进阶学习(三)

文章探讨了如何优雅地处理和展示按状态(如已实现和未实现)和类别分组的数据。通过使用枚举处理status状态和接口定义category,结合映射对象保证了代码的扩展性和可维护性。当新增状态或类别时,只需更新配置而无需改动核心代码。
摘要由CSDN通过智能技术生成

代码优雅化进阶学习(三)

需求详情

如下图:
实现类似结构,首先按照 status 状态的值,分为全部 已实现 和 未实现;再按照 categoryId 来展示各类别

在这里插入图片描述


难点

  1. 如何保证 status 的扩展性和可维护性
  2. 如何保证若新增分类,即新增 categoryId 的可维护性

最佳实现效果

  • 新增 categoryId ,不需要改内部逻辑代码,只需新增配置,就可以自动实现 新增分类的对应数据
  • 新增 status,不需要改内部逻辑代码,只需新增配置,就可以自动实现 新增状态的对应数据

实现

export enum IStatus {
    /**
     * 未实现
     */
    NotObtained = 0,
    /**
     * 已实现
     */
    Obtained = 1
}

interface ICategory{
    title: string;
    data: IListItemTpe[];
}

const CATEGORY_MAP: { [_: string]: string } = {
    1: "苹果",
    2: "香蕉"
};

export function formatData(list: IListItemTpe[] | null, status: IStatus | null): ICategory[] {
    const categoryMap: { [_: string]: IListItemTpe[] } = {};

    list?.filter((item) => item.status === status)
        .forEach((item) => {
            const { categoryId } = item;
            if (!categoryMap[categoryId!]) categoryMap[categoryId!] = [];
            categoryMap[categoryId!].push(item);
        });
    return Object.keys(categoryMap).map((key) => {
        return {
            title: CATEGORY_MAP[key],
            data: categoryMap[key]
        };
    });
}

优点

  • 用 map 取代了多个 if-else ,将所有 categoryId 作为 map 的key,value 值就是对应的 数据列表
  • 用 另一个map 来做 categoryId 和 title 的 一一对应,相当于是一个配置文件,当新增 categoryId 时,直接在 该 map 里面进行添加配置
  • 相当于使用了两个及多个 map 来避免多重 if else,并且满足了可维护性

前端小菜鸟持续学习中,欢迎指正!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值