← 中文资源

简体中文版本

按业务键去重并保留首个元素

使用键函数或属性名移除数组中的重复对象,保持原顺序并保留首次出现的元素。

阅读英文原文

功能说明

对象数组去重常需要按业务键而不是引用或 JSON 字符串判断。该工具接收键函数或属性名,保留第一次出现的元素,并维持原数组顺序。内部使用 Set 记录已见键,时间复杂度为线性,适合合并接口结果和清理重复记录。

关键代码

uniqueBy 校验数组与函数,遍历元素计算键,若 Set 已含该键则跳过,否则加入并推入结果。uniqueByProperty 是读取指定属性的便捷包装,属性不存在时键为 undefined,所有缺失项只保留第一个。两个函数都不修改原数组。

const key = keyFn(item);
if (seen.has(key)) continue;
seen.add(key);
result.push(item);

使用注意

键比较使用 SameValueZero,对象键只有引用相同才会被视为重复,不能按结构比较。属性名为空字符串会被拒绝,属性不存在时使用 undefined 作为键。若需要保留最后一次出现,应反向遍历后再反转结果。返回新数组,元素对象仍共享引用。

验证方式

断言 uniqueBy([{ id: 1 }, { id: 2 }, { id: 1 }], (item) => item.id) 返回前两项。uniqueByProperty 得到相同结果。多个缺失属性的元素只保留第一个。非数组或非函数参数抛 TypeError。输入顺序应保持不变。