数组增量超1时跳过索引检测优化 配餐APP跳过餐食识别实现
配餐服务应用跳过餐食补发逻辑优化方案
需求说明
- 应用需校验用户已领取的餐食,支持用户根据当前时段选择对应餐食
- 用户跳过中间时段餐食时,系统需要记录跳过的餐食并为用户补发
示例场景:若用户已领取的餐食为「morning」,直接跳选到「night」,则需要同时为用户发放「afternoon」、「evening」两个时段的餐食。
现有实现优化点
你提供的代码已经可以得到正确结果,但存在两个可提升的点:
- 重复调用
meals.indexOf3次,每次调用都会遍历一次整个餐食列表,产生不必要的性能开销 - 手动写for循环遍历拼接数组,代码冗余度高,可读性较差
优化实现方案
基础优化版(兼容所有场景,代码简洁度高)
直接复用索引查询结果,用原生slice方法切割数组,逻辑和原有逻辑完全一致,性能更优:
const meals = ['morning', 'afternoon', 'evening', 'night', 'midnight']; const currentMeal = 'afternoon'; const navigatedMeal = 'midnight'; // 仅查询两次索引,复用结果避免重复遍历 const currentMealIndex = meals.indexOf(currentMeal); const navigatedMealIndex = meals.indexOf(navigatedMeal); let skippedMealsArray = []; // 间隔大于1时才存在需要补发的跳过餐食 if (navigatedMealIndex - currentMealIndex > 1) { // slice为左闭右开,结束索引+1即可包含选中的navigatedMeal skippedMealsArray = meals.slice(currentMealIndex + 1, navigatedMealIndex + 1); } // 输出结果:['evening', 'night', 'midnight']
高频调用场景优化版
如果这个逻辑需要频繁调用(比如高并发的服务端场景、前端多用户频繁操作场景),可以提前建立餐食到索引的映射表,把索引查询复杂度从O(n)降到O(1):
const meals = ['morning', 'afternoon', 'evening', 'night', 'midnight']; // 初始化阶段仅执行一次,生成索引映射 const mealIndexMap = meals.reduce((map, meal, index) => { map[meal] = index; return map; }, {}); // 业务逻辑执行时直接读映射表,无需遍历数组 const currentMeal = 'afternoon'; const navigatedMeal = 'midnight'; const currentMealIndex = mealIndexMap[currentMeal]; const navigatedMealIndex = mealIndexMap[navigatedMeal]; let skippedMealsArray = []; if (navigatedMealIndex - currentMealIndex > 1) { skippedMealsArray = meals.slice(currentMealIndex + 1, navigatedMealIndex + 1); }
内容的提问来源于stack exchange,提问作者Pratik Sawant
相关产品推荐
相关产品推荐

