哈希表优化数组去重的核心是将“查找是否已存在”从o(n)降至o(1),使整体时间复杂度由o(n²)降为o(n);其原理是利用键直接存取(如对象{}以值为key设true,或map支持任意类型key),避免indexof/includes的遍历开销。

用哈希表结构优化数组去重,核心是把“查找是否已存在”的操作从 O(n) 降到 O(1),从而让整体时间复杂度从 O(n²) 降为 O(n)。
为什么哈希表能提速
传统用 indexOf 或 includes 判断元素是否重复,每次都要遍历已有结果数组,相当于内层循环;而哈希表(如普通对象 {} 或 Map)通过键直接存取,查一个值基本不花时间。
- 对象哈希表:用元素值作 key,值设为
true,例如hash[2] = true -
Map更安全:支持任意类型作 key(包括对象、NaN),避免对象 key 自动转字符串的陷阱 - 注意:对象哈希表只适用于可转为字符串的基本类型(数字、字符串、布尔值);
Map适用范围更广
手写哈希表去重(对象版)
适合简单类型,代码轻量,兼容性好:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
function uniqueByHash(arr) {
if (!Array.isArray(arr)) return [];
const hash = {};
const result = [];
for (let i = 0; i
-
hasOwnProperty比直接!hash[item]更稳妥,避免0、false、""被误判 - 不支持
NaN或对象:因为NaN + '' === "NaN",多个NaN会被当成同一个 key
用 Map 实现通用哈希去重
解决对象、NaN、undefined 等特殊值去重问题:
function uniqueByMap(arr) {
if (!Array.isArray(arr)) return [];
const seen = new Map();
const result = [];
for (const item of arr) {
if (!seen.has(item)) {
seen.set(item, true);
result.push(item);
}
}
return result;
}
-
Map.has()正确识别NaN === NaN,也支持引用类型作为 key(但注意:两个不同对象即使内容相同,也被视为不同 key) - 若需按对象某个字段(如
id)去重,应手动提取该字段作为 key,而非直接用对象
对比 Set 和哈希表的实际效果
new Set(arr) 底层就是哈希表实现,所以性能和手写 Map 版接近,都是 O(n)。区别在于:
-
Set是声明式、一行搞定,适合大多数业务场景 - 手写哈希表(尤其
Map)更可控:可插入中间逻辑(如过滤、转换)、支持自定义 key 提取、便于调试或埋点 - 对象哈希表虽快,但有类型限制和边界问题;
Map和Set是现代标准方案,推荐优先使用










