JavaScript中用reduce可灵活实现SQL式去重:按单字段、多字段组合、仅提取值或保留最后记录,核心是用Map或Set记录唯一键并控制覆盖逻辑。

JavaScript 中用 reduce 实现类似 SQL 的去重查询,核心是把数组“归约”成一个无重复的集合(如对象或 Set),再按需提取结果。它不直接等价于 SELECT DISTINCT,但能灵活模拟其行为,尤其适合处理对象数组并按指定字段去重。
按单个字段去重(类似 SELECT DISTINCT name FROM users)
用 reduce 配合对象或 Set 记录已出现的值,跳过重复项:
const users = [
{ id: 1, name: 'Alice', dept: 'HR' },
{ id: 2, name: 'Bob', dept: 'IT' },
{ id: 3, name: 'Alice', dept: 'Finance' }
];
// 按 name 去重,保留第一个出现的对象
const uniqueByName = users.reduce((acc, item) => {
if (!acc.has(item.name)) {
acc.set(item.name, item);
}
return acc;
}, new Map());
const result = Array.from(uniqueByName.values());
// [{ id: 1, name: 'Alice', dept: 'HR' }, { id: 2, name: 'Bob', dept: 'IT' }]
按多个字段组合去重(类似 SELECT DISTINCT name, dept FROM users)
将多个字段拼成唯一键(如 name|dept),再用 Map 或对象做判断:
const uniqueByCombo = users.reduce((acc, item) => {
const key = `${item.name}|${item.dept}`;
if (!acc.has(key)) {
acc.set(key, item);
}
return acc;
}, new Map());
const result = Array.from(uniqueByCombo.values());
只提取去重后的字段值(纯数组,类似 SELECT DISTINCT dept FROM users)
更轻量:用 Set 收集值,再转为数组:
立即学习“Java免费学习笔记(深入)”;
const depts = Array.from( users.reduce((set, item) => set.add(item.dept), new Set()) ); // ['HR', 'IT', 'Finance']
保留最后出现的记录(类似 “覆盖式” 去重)
只需调整逻辑:每次都更新,而非跳过:
const latestByDept = users.reduce((acc, item) => {
acc.set(item.dept, item); // 后来的会覆盖前面的
return acc;
}, new Map());
注意:相比 [...new Set(arr)] 这种简单数组去重,reduce 的优势在于可控性强——可自定义键、保留原始结构、支持对象深层比较(需配合 JSON.stringify 等,但慎用于含函数或循环引用的对象)。实际使用中,优先考虑可读性;复杂去重逻辑建议封装成函数,避免每次重复写 reduce。


















