数组去重实现
使用 Set、Map、filter 等方式实现数组去重
问题
实现数组去重,要求掌握多种实现方式:Set、Map、filter。
解答
使用 Set
function uniqueBySet(arr) {
// Set 自动去除重复值
return [...new Set(arr)];
}
// 测试
const arr = [1, 2, 2, 3, 3, 3, 4];
console.log(uniqueBySet(arr)); // [1, 2, 3, 4]
使用 Map
function uniqueByMap(arr) {
const map = new Map();
const result = [];
for (const item of arr) {
// 用 Map 记录已出现的元素
if (!map.has(item)) {
map.set(item, true);
result.push(item);
}
}
return result;
}
// 测试
const arr = [1, 2, 2, 3, 3, 3, 4];
console.log(uniqueByMap(arr)); // [1, 2, 3, 4]
使用 filter
function uniqueByFilter(arr) {
// 只保留第一次出现的元素
return arr.filter((item, index) => arr.indexOf(item) === index);
}
// 测试
const arr = [1, 2, 2, 3, 3, 3, 4];
console.log(uniqueByFilter(arr)); // [1, 2, 3, 4]
使用 reduce
function uniqueByReduce(arr) {
return arr.reduce((acc, item) => {
// 累加器中不存在则添加
if (!acc.includes(item)) {
acc.push(item);
}
return acc;
}, []);
}
// 测试
const arr = [1, 2, 2, 3, 3, 3, 4];
console.log(uniqueByReduce(arr)); // [1, 2, 3, 4]
对象数组去重
function uniqueByKey(arr, key) {
const map = new Map();
return arr.filter(item => {
const value = item[key];
if (map.has(value)) {
return false;
}
map.set(value, true);
return true;
});
}
// 测试
const users = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice2' }
];
console.log(uniqueByKey(users, 'id'));
// [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]
关键点
- Set 方案:最简洁,一行代码,时间复杂度 O(n)
- Map 方案:适合需要额外处理的场景,时间复杂度 O(n)
- filter + indexOf:代码直观,但时间复杂度 O(n²)
- reduce + includes:同样 O(n²),大数组慎用
- 对象数组:需要指定去重的 key,用 Map 记录已出现的值
目录