map配合array.from可实现对象数组动态去重与排序:利用map键唯一性去重(保留首次/末次出现项),array.from提取值后链式sort完成多字段灵活排序,不修改原数组。

用 Map 配合 Array.from 实现对象数组的动态去重与排序,核心在于:利用 Map 的键唯一性做去重,再通过 Array.from 提取其值并链式调用 sort 完成排序。整个过程不修改原数组,可灵活控制去重字段和排序逻辑。
用 Map 按指定字段去重(保留最后出现项)
Map 的键必须是唯一值,因此可把对象中用于判断重复的字段(如 id、name)作为键,对象本身作为值存入。后续相同键的赋值会自动覆盖,从而实现“保留最后一次出现”的去重效果。
示例:按 id 去重
const arr = [
{ id: 1, name: 'Alice', score: 85 },
{ id: 2, name: 'Bob', score: 92 },
{ id: 1, name: 'Alicia', score: 88 }, // 重复 id,覆盖前一项
{ id: 3, name: 'Charlie', score: 76 }
];
<p>const uniqueMap = new Map(arr.map(item => [item.id, item]));
const uniqueArr = Array.from(uniqueMap.values());
// → [{ id: 1, name: 'Alicia', score: 88 }, { id: 2, name: 'Bob', score: 92 }, { id: 3, name: 'Charlie', score: 76 }]
</p>
按指定字段去重(保留首次出现项)
若想保留第一次出现的对象(更常见需求),需反向遍历或改用 reduce + Map,但更简洁的方式是:先用 filter 配合 Set 收集已见 key,再构建 Map;不过直接用 Map 构造时正序插入,再用 !map.has(key) 判断即可。
推荐写法(正序 + 条件插入):
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
const uniqueMap = new Map();
arr.forEach(item => {
if (!uniqueMap.has(item.id)) {
uniqueMap.set(item.id, item);
}
});
const uniqueArr = Array.from(uniqueMap.values());
链式完成去重 + 多字段动态排序
在获取 Array.from(uniqueMap.values()) 后,直接调用 sort 即可。支持数值、字符串、日期等类型排序,也可封装为可复用函数。
- 按数字字段升序:
.sort((a, b) => a.score - b.score) - 按字符串字段升序(忽略大小写):
.sort((a, b) => a.name.localeCompare(b.name)) - 多字段组合排序(先按 score 降序,score 相同时按 name 升序):
.sort((a, b) => b.score - a.score || a.name.localeCompare(b.name))
完整示例(去重 + score 降序 + name 升序):
const result = Array.from(
arr.reduce((map, item) => {
if (!map.has(item.id)) map.set(item.id, item);
return map;
}, new Map()).values()
).sort((a, b) => b.score - a.score || a.name.localeCompare(b.name));
封装成可复用的工具函数
把去重字段(keyFn)和排序逻辑(compareFn)参数化,提升复用性:
function uniqueAndSort(arr, keyFn, compareFn = (a, b) => 0) {
const map = new Map();
for (const item of arr) {
const key = keyFn(item);
if (!map.has(key)) map.set(key, item);
}
return Array.from(map.values()).sort(compareFn);
}
<p>// 使用
uniqueAndSort(
arr,
item => item.id,
(a, b) => b.score - a.score
);
</p>
不复杂但容易忽略:Map 键对对象引用敏感,务必确保 keyFn 返回原始值(如 string/number),避免传入对象或数组导致去重失效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










