如何实现API接口多查询参数与逻辑同时筛选武器数据?
问题根源
你当前的写法是每个查询条件单独从全量武器数据中筛选,再用concat拼接结果,得到的自然是多条件的并集。要实现“同时满足所有条件”的与逻辑,应该从全量数据出发,依次叠加所有生效的筛选规则。
优化后代码
// 提前拉取全量武器数据,仅执行一次异步请求 const allWeapons = await weapons; let filtered = [...allWeapons]; if (query.type) { // 提前格式化目标类型,避免循环中重复执行工具函数 const targetType = formatName(query.type); filtered = filtered.filter(w => formatName(w.weaponType) === targetType); } if (query.rarity) { filtered = filtered.filter(w => w.rarity == query.rarity); } // 若业务确实要求无匹配结果时返回全量数据,可保留下面这行,否则建议删除 // if (!filtered.length) filtered = allWeapons; res.status(HttpStatusCodes.ACCEPTED).send(filtered);
方案说明
- 把
await weapons提前缓存,避免原写法中每个if分支都重复执行异步请求的性能损耗 - 初始过滤池直接使用全量武器数据,每个生效的查询条件都在上一轮的过滤结果中做二次筛选,天然实现多条件的与逻辑
- 后续如果需要新增筛选参数(比如武器元素类型、基础攻击力阈值等),只要新增对应的
if分支叠加filter即可,扩展性很强 - 原写法中无匹配结果时赋值全量数据的逻辑,属于不符合常规筛选预期的特殊处理,确认业务有需要再保留即可
内容的提问来源于stack exchange,提问作者QZAK
相关产品推荐
相关产品推荐

