如何在TypeScript中按字符串/枚举数组字段对对象列表进行分组
实现代码
// 定义输出结果的类型 type GroupedDishes = Record<keyof typeof TypeOfMeal, Array<Omit<Dish, 'category'> & { category: string[] }>> // 初始化结果对象,预先填充所有分类对应的空数组 const groupedResult = Object.values(TypeOfMeal) .filter(val => typeof val === 'string') .reduce((acc, mealType) => { acc[mealType as keyof typeof TypeOfMeal] = [] return acc }, {} as GroupedDishes) // 遍历所有菜品完成分组 dishes.forEach(dish => { // 先把当前菜品的category枚举转成字符串数组 const convertedCategory = dish.category.map(mealEnum => TypeOfMeal[mealEnum]) const processedDish = { name: dish.name, category: convertedCategory } // 每个所属分类都添加当前菜品 convertedCategory.forEach(mealType => { groupedResult[mealType as keyof typeof TypeOfMeal].push(processedDish) }) })
逻辑说明
- 利用TS数字枚举的反向映射特性,
TypeOfMeal[mealEnum]可以直接拿到枚举值对应的字符串名称 - 遍历菜品时先统一转换category字段的枚举值为字符串,避免重复计算
- 属于多个分类的菜品会自动添加到所有对应分类的数组中,完全匹配你给出的输出要求
- 如果后续你把枚举改为字符串枚举,只需要把
convertedCategory的转换逻辑调整为直接返回枚举值即可,当前代码适配你给出的默认数字枚举场景
内容的提问来源于stack exchange,提问作者Ania
相关产品推荐
相关产品推荐

