set 适合搜索历史去重因其自动去重、插入高效,遍历保留插入顺序,配合 array.from().reverse().slice() 可实现最新优先与数量限制,支持 trim 防重复、delete/add 置顶、localstorage 序列化持久化。

用 JavaScript 的 Set 实现历史搜索记录的去重与插入非常直接:它天然去重,插入即自动 dedupe,无需额外判断。
为什么 Set 适合做搜索历史去重
Set 是一个集合数据结构,内部自动保证元素唯一性。相同字符串(或相同引用对象)多次添加,只会保留一份。对搜索记录这种以字符串为主、要求不重复的场景,比用数组 + includes() 或 filter() 高效且简洁。
基础用法:添加、读取、限制数量
通常搜索历史需要「最新优先」展示,且有数量上限(比如最多 10 条)。Set 本身不保证顺序,但插入顺序在遍历时会保留(ES2015+ 规范保证),所以可配合数组转换来控制顺序:
- 每次新搜索词用
set.add(keyword)插入 —— 自动去重 - 转成数组后用
.reverse()实现「最新在前」(因为后插入的在 Set 迭代末尾) - 再用
.slice(0, 10)截取最新 10 条
示例代码:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const searchHistory = new Set();
function addSearch(keyword) {
if (!keyword || typeof keyword !== 'string') return;
searchHistory.add(keyword.trim());
}
function getRecentSearches(limit = 10) {
return Array.from(searchHistory).reverse().slice(0, limit);
}
// 使用
addSearch('apple');
addSearch('banana');
addSearch('apple'); // 不会重复
console.log(getRecentSearches()); // ['apple', 'banana']
进阶:支持「置顶」或「删除某条」
Set 没有内置索引或位置操作,所以「置顶」需借助数组逻辑。常见做法是先删除再重新添加(利用 Set 插入顺序特性):
- 要置顶某关键词:先
set.delete(keyword),再set.add(keyword) - 要删除某条:直接
set.delete(keyword) - 清空历史:
set.clear()
注意:如果用户输入前后空格不同(如 "react " 和 "react"),建议统一 trim() 后再操作,避免语义重复。
持久化到 localStorage 的注意事项
Set 不能直接存入 localStorage(只支持字符串)。需序列化为数组:
- 保存时:
localStorage.setItem('searchHistory', JSON.stringify(Array.from(searchHistory))) - 读取时:
const saved = JSON.parse(localStorage.getItem('searchHistory') || '[]');,再用new Set(saved)恢复 - 注意 JSON 不支持函数、undefined、Symbol 等,搜索记录一般只有字符串,安全
不复杂但容易忽略:恢复时最好加类型校验,防止存储损坏导致解析失败。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










