可用reduce配合hasownproperty对数组对象按属性去重:先用临时对象作哈希表记录已出现的key,仅保留首次出现的对象,再通过object.values转为数组;因hasownproperty只检查自身属性、避免原型链干扰和falsy值误判,故优于in或obj[key]===undefined。

可以用 reduce 配合 hasOwnProperty 对数组对象去重(按某个属性),核心思路是:用一个临时对象做“哈希表”记录已出现的 key,只保留首次出现的对象。
适用于对象数组按字段去重
比如有一个用户列表,想根据 id 去重:
const users = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice (dup)' },
{ id: 3, name: 'Charlie' }
];
用 reduce + hasOwnProperty 实现:
const uniqueUsers = users.reduce((acc, item) => {
const key = item.id;
if (!acc.hasOwnProperty(key)) {
acc[key] = item;
}
return acc;
}, {});
此时 uniqueUsers 是一个对象,键为 id,值为对应对象。如需数组,再加一步:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
const result = Object.values(uniqueUsers); // [{id:1,...}, {id:2,...}, {id:3,...}]
为什么用 hasOwnProperty 而不是 in 或 obj[key] === undefined
hasOwnProperty 只检查对象自身属性,不查原型链,更安全;in 会命中继承属性,obj[key] === undefined 在值本身为 undefined 时会误判。
- 若
item.id是0、false、''等 falsy 值,用!acc[key]会出错 -
acc.hasOwnProperty(key)明确判断属性是否存在,语义清晰、无歧义
可复用的通用去重函数
封装成函数,支持传入取 key 的回调:
function uniqueBy(arr, getKey) {
return Object.values(
arr.reduce((map, item) => {
const key = getKey(item);
if (!map.hasOwnProperty(key)) {
map[key] = item;
}
return map;
}, {})
);
}
// 使用示例
const result = uniqueBy(users, item => item.id);
// 或按 name 去重
const byName = uniqueBy(users, item => item.name);
注意点
该方法会改变原数组顺序(因为 Object.values 按插入顺序返回,现代 JS 保证这一点),但不修改原数组元素;它适合单字段去重,不适用于多字段联合去重(此时建议用 JSON.stringify 拼接 key,或用 Map)。
不复杂但容易忽略细节,关键是选对 key 判断方式和最后转回数组的时机。










