标准答案

  1. 基础类型数组可以用 [...new Set(array)] 去重。
  2. Set 使用 SameValueZero 判断相等,NaN 可以被正确去重,0 和 -0 会被视为相同。
  3. 对象数组不能直接用 Set 去重内容相同的对象,因为对象按引用比较。
  4. 对象数组通常按 id、key 或序列化后的稳定标识去重。
  5. 实际项目要先明确是否保留第一次出现的元素、最后一次出现的元素,还是需要合并数据。

题目解析

数组去重看起来是入门题,但关键在于说明适用边界。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 和循环引用。

作者信息