功能说明
对象数组去重常需要按业务键而不是引用或 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。输入顺序应保持不变。