includes不能直接过滤参数,仅返回布尔值;需结合filter、set等实现去重,注意对象需字符串化比较,生产环境推荐map/set+json.stringify+abortcontroller方案。

JavaScript 中 includes 本身不能直接“过滤”参数,它只是判断数组是否包含某个值(返回布尔值)。但你可以结合 includes + 数组操作(如 filter、reduce 或手动去重逻辑),在发起请求前剔除重复的参数项。关键在于:先收集所有待发请求的参数,再用 includes 辅助判断是否已存在,从而跳过重复项。
用 includes 配合 filter 去重请求参数数组
适用于你有一组待处理的请求参数(比如多个 { url, params } 对象),想按某个字段(如 url 或 params.id)去重:
const pendingRequests = [
{ url: '/api/user', params: { id: 1 } },
{ url: '/api/user', params: { id: 1 } }, // 重复
{ url: '/api/user', params: { id: 2 } },
];
// 按 url + JSON.stringify(params) 去重(简单场景)
const seen = [];
const uniqueRequests = pendingRequests.filter(req => {
const key = req.url + JSON.stringify(req.params);
if (seen.includes(key)) return false;
seen.push(key);
return true;
});
// uniqueRequests 现在只有两个不重复项
发送前检查:避免同一参数组合被多次调用
适合防抖式场景——比如用户快速点击按钮多次,你想确保相同参数只发一次请求:
const pendingKeys = new Set();
function safeFetch(url, params) {
const key = `${url}?${new URLSearchParams(params).toString()}`;
if (pendingKeys.has(key)) {
console.log('请求已存在,跳过:', key);
return Promise.resolve(null);
}
pendingKeys.add(key);
return fetch(url, {
method: 'GET',
params // 实际中需拼到 URL 或 body 中
}).finally(() => pendingKeys.delete(key));
}
// 调用示例
safeFetch('/api/search', { q: 'js' });
safeFetch('/api/search', { q: 'js' }); // 不会重复发
注意 includes 的局限性:对象不能直接比较
includes 对对象/数组引用敏感,[1,2].includes([1,2]) 是 false。所以别这样写:
// ❌ 错误:对象字面量每次都是新引用
const paramsList = [{ id: 1 }, { id: 1 }];
paramsList.includes({ id: 1 }); // false
// ✅ 正确:转成字符串或用 Map/Set 存 key
const keys = paramsList.map(p => JSON.stringify(p));
keys.includes(JSON.stringify({ id: 1 })); // true
更健壮的替代方案(推荐生产环境)
虽然你问的是 includes,但实际项目中建议用更可靠的去重方式:
- 用
Map或Set存唯一键(性能好、语义清) - 对复杂参数用
JSON.stringify归一化(注意 key 顺序、undefined 过滤) - 结合
AbortController取消未响应的重复请求,不只是跳过 - 使用请求库(如 axios)的 cancel token 或自定义 adapter 做拦截去重
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











