You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组增量超1时跳过索引检测优化 配餐APP跳过餐食识别实现

配餐服务应用跳过餐食补发逻辑优化方案

需求说明

  • 应用需校验用户已领取的餐食,支持用户根据当前时段选择对应餐食
  • 用户跳过中间时段餐食时,系统需要记录跳过的餐食并为用户补发

示例场景:若用户已领取的餐食为「morning」,直接跳选到「night」,则需要同时为用户发放「afternoon」、「evening」两个时段的餐食。

现有实现优化点

你提供的代码已经可以得到正确结果,但存在两个可提升的点:

  1. 重复调用meals.indexOf3次,每次调用都会遍历一次整个餐食列表,产生不必要的性能开销
  2. 手动写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:51:03