标准答案
- 基础类型数组可以用 [...new Set(array)] 去重。
- Set 使用 SameValueZero 判断相等,NaN 可以被正确去重,0 和 -0 会被视为相同。
- 对象数组不能直接用 Set 去重内容相同的对象,因为对象按引用比较。
- 对象数组通常按 id、key 或序列化后的稳定标识去重。
- 实际项目要先明确是否保留第一次出现的元素、最后一次出现的元素,还是需要合并数据。
题目解析
数组去重看起来是入门题,但关键在于说明适用边界。Set 对基础类型很简洁,但对对象只能去掉同一个引用,不能判断两个对象内容是否相同。
对象数组去重时,业务唯一键比通用深比较更可靠。比如用户列表按 user.id 去重,比把整个对象 JSON.stringify 后比较更清楚,也更不容易受字段顺序影响。
去重策略还会影响结果稳定性。保留第一次出现还是最后一次出现,会影响排序和数据覆盖,面试回答时应该把规则说清楚。
代码示例
基础类型可以用 Set;对象数组更适合按稳定 key 去重。
JavaScript
function unique(array) {
return [...new Set(array)]
}
function uniqueBy(array, getKey) {
const seen = new Set()
const result = []
for (const item of array) {
const key = getKey(item)
if (!seen.has(key)) {
seen.add(key)
result.push(item)
}
}
return result
}常见误区
- 直接用 Set 去重对象数组,以为内容相同的对象会被合并。
- 没有说明保留第一次还是最后一次,导致结果规则不稳定。
- 用 JSON.stringify 做通用对象去重,忽略字段顺序、函数、undefined 和循环引用。