如何降低Node.js中LocationId数据获取及时间筛选代码的复杂度?
优化后的Node.js代码实现
核心优化思路
- 用配置映射表替代冗余的
if-else分支,降低代码复杂度 - 单独抽离
Day类型的特殊逻辑,确保循环获取当日数据的需求 - 统一构建查询条件,减少重复代码
优化代码
// 定义筛选配置映射表,统一管理各类型的参数 const filterConfig = { Day: { graphData: graph_data_of_day, dateQuery: { gt: current_date }, includeRef: true, needLoop: true // 标记Day类型需要循环获取数据 }, Week: { graphData: graph_data_of_weeks, dateQuery: { gte: startofweek_date, lte: endofweek_date }, includeRef: true }, Month: { graphData: graph_data_of_months, dateQuery: { gte: startOfMonth_date, lte: endOfMonth_date }, includeRef: true }, Year: { graphData: graph_data_of_year, dateQuery: { gte: startOfYear_date, lte: endOftheYear_date }, includeRef: true }, custom: { graphData: [1, 2, 3, 4, 5, 7, 3, 12, 4, 2, 5, 6], dateQuery: { gte: custom_start_date, lt: custom_end_date }, includeRef: false } }; // 获取当前筛选类型的配置 const config = filterConfig[filter_by]; if (!config) { // 处理未定义的筛选类型,可根据需求添加默认逻辑 graph_data = []; query = {}; } else { graph_data = config.graphData; // 构建基础查询条件 query = { created_at: config.dateQuery }; // 添加ref字段(如果配置要求) if (config.includeRef && headerData?.ref) { query.ref = headerData.ref; } // 添加locationid筛选条件(非Day类型时,按locationid或默认获取) if (!config.needLoop && locationid) { query.locationid = locationid; } // Day类型特殊逻辑:无论locationid是否为空,循环获取当日数据 if (config.needLoop) { // 这里替换成你的循环获取逻辑,示例: const fetchDayData = async () => { const targetLocations = locationid ? [locationid] : getDefaultLocations(); for (const loc of targetLocations) { const dayData = await fetchYourData({ ...query, locationid: loc }); // 处理获取到的当日数据,比如合并到graph_data mergeGraphData(graph_data, dayData); } }; await fetchDayData(); } }
优化点说明
- 配置映射表:把每个筛选类型对应的
graph_data、日期范围、是否需要ref等参数集中管理,后续新增筛选类型只需在配置表中添加,无需修改逻辑代码。 - Day类型特殊处理:通过
needLoop标记区分,单独处理循环逻辑,确保无论locationid是否为空,都按给定值(或默认列表)循环获取当日数据。 - 动态构建查询:统一处理
ref和locationid的添加逻辑,避免重复的对象赋值代码。 - 容错处理:增加了未定义筛选类型的默认逻辑,提升代码健壮性。
内容的提问来源于stack exchange,提问作者kick
相关产品推荐
相关产品推荐

