foreach 本身不返回新数组,需配合对象键名唯一性实现去重:遍历时用值(或字段如 id)作 key 记录是否已见,未见则收集。适用于基本类型或有稳定键的对象,但存在隐式类型转换限制。

JavaScript 中 forEach 本身不返回新数组,也不能直接用于去重,但它可以配合对象(或 Map)以键名方式记录已出现的值,从而实现去重逻辑。关键在于:利用对象属性名的唯一性来“标记”某个值是否已存在。
用对象键名做“哈希表”记录已见值
对象的属性名天然唯一,适合当简易哈希表。遍历时,把每个待判断的值转为字符串(或确保是合法键名),作为对象的 key。若该 key 不存在,说明是新值,可收集;否则跳过。
- 适用于基本类型(如字符串、数字)或有稳定字符串表示的对象(如 id 字段)
- 注意:
{}不能直接存undefined、null或对象引用作 key(会被自动转成"[object Object]"),需提前处理 - 推荐用
Map替代普通对象,更安全(支持任意类型 key),但题目要求用“对象键名”,这里仍以 plain object 演示
对数组元素去重(基于某个字段,如 id)
常见场景:数组里是对象,按 id 去重。用空对象记录已出现的 id,再用 forEach 遍历筛选:
const list = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice2' },
{ id: 3, name: 'Charlie' }
];
const seen = {};
const uniqueList = [];
list.forEach(item => {
if (!seen[item.id]) {
seen[item.id] = true;
uniqueList.push(item);
}
});
// uniqueList = [{ id:1, name:'Alice' }, { id:2, name:'Bob' }, { id:3, name:'Charlie' }]
对简单数组去重(字符串/数字)
直接用值本身作 key(自动转字符串):
const arr = ['a', 'b', 'a', 'c', 'b'];
const seen = {};
const result = [];
arr.forEach(val => {
if (!seen[val]) {
seen[val] = true;
result.push(val);
}
});
// result = ['a', 'b', 'c']
⚠️ 注意:seen[0] 和 seen['0'] 是同一个 key,所以 [0, '0'] 会被判为重复 —— 这是对象键隐式转换带来的限制。如需严格类型区分,改用 Map 或 JSON.stringify + 类型标识。
为什么不直接用 Set + Array.from?
现代写法更简洁:[...new Set(arr)] 或 Array.from(new Set(arr))。但题目强调“用 forEach 结合对象键名”,本质是考察手动模拟哈希去重的过程,理解底层逻辑。实际项目中,优先用 Set,语义清晰、性能好、无类型陷阱。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











