javascript 中用 set 实现好友共同关注的核心是利用其自动去重和 o(1) 查找特性;先将关注列表转为 set,再用 filter + has 求交集,或封装通用 intersection 函数支持多用户,兼顾性能与可读性。

用 JavaScript 的 Set 实现好友共同关注,核心是利用其自动去重和高效的查找(O(1) 平均时间复杂度)特性,避免嵌套循环和重复计算。
把每个用户关注列表转为 Set
先将原始数组(如用户 A、B 的关注列表)转换为 Set,这样后续交集操作更简洁、性能更好:
const userAFollows = new Set(['user1', 'user2', 'user3', 'user5']); const userBFollows = new Set(['user2', 'user3', 'user4', 'user6']);
用 filter + has 找共同关注(推荐)
遍历其中一个 Set,用另一个 Set 的 has() 判断是否存在——这是最直观、可读性强且性能优秀的方式:
const mutualFollows = [...userAFollows].filter(id => userBFollows.has(id)); // 结果:['user2', 'user3']
- 利用
[...set]展开为数组便于遍历 -
set.has()是常数时间查找,整体复杂度为O(n),远优于双层 for 循环的O(n×m) - 如果只关心是否互相关注,甚至可以提前退出(加个
some()判断存在性)
封装成可复用的交集函数
多个好友求共同关注时,可以写一个通用交集函数,支持任意数量的 Set:
function intersection(...sets) {
if (sets.length === 0) return new Set();
if (sets.length === 1) return new Set(sets[0]);
const result = new Set(sets[0]);
for (const set of sets.slice(1)) {
for (const item of result) {
if (!set.has(item)) result.delete(item);
}
}
return result;
}
// 用法
const common = intersection(userAFollows, userBFollows, userCFollows);
console.log([...common]); // ['user3']
- 该函数返回的是新
Set,不修改原数据 - 适合「三人及以上共同关注」这类场景
- 内部逐个过滤,保持线性增长的效率
注意边界与优化细节
实际业务中需考虑这些点:
- 数据为空或 null?建议在转换前校验:
Array.isArray(list) ? new Set(list) : new Set() - ID 类型要一致:确保都是字符串或都转成字符串(比如后端返回数字 ID,前端统一 toString())
- 大小写敏感?必要时统一
.toLowerCase()再建 Set - 不需要完整列表,只要数量?直接用
reduce统计更省内存:[...userAFollows].reduce((n, id) => userBFollows.has(id) ? n + 1 : n, 0)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











