跳到主要内容

数组去重

多种 JavaScript 数组去重方法。

使用 Set(推荐)

const arr = [1, 2, 2, 3, 4, 4, 5];

// 最简单的方法
const unique = [...new Set(arr)];
console.log(unique); // [1, 2, 3, 4, 5]

// 或
const unique2 = Array.from(new Set(arr));

使用 filter + indexOf

const arr = [1, 2, 2, 3, 4, 4, 5];

const unique = arr.filter((item, index, self) => {
return self.indexOf(item) === index;
});
console.log(unique); // [1, 2, 3, 4, 5]

使用 reduce

const arr = [1, 2, 2, 3, 4, 4, 5];

const unique = arr.reduce((acc, cur) => {
if (!acc.includes(cur)) {
acc.push(cur);
}
return acc;
}, []);

console.log(unique); // [1, 2, 3, 4, 5]

对象数组去重

const arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice' }
];

// 按 id 去重
const unique = [];
const map = new Map();

arr.forEach(item => {
if (!map.has(item.id)) {
map.set(item.id, true);
unique.push(item);
}
});

console.log(unique); // [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]

使用 reduce + Map

const arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice' }
];

const unique = Object.values(
arr.reduce((acc, cur) => {
acc[cur.id] = cur;
return acc;
}, {})
);

console.log(unique); // [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]

性能对比

// 大数据量测试
const largeArray = Array.from({ length: 10000 }, () =>
Math.floor(Math.random() * 1000)
);

// Set 方法最快
console.time('Set');
[...new Set(largeArray)];
console.timeEnd('Set');

// filter + indexOf
console.time('filter');
largeArray.filter((v, i, a) => a.indexOf(v) === i);
console.timeEnd('filter');

注意事项

// Set 对对象引用去重
const arr = [{ a: 1 }, { a: 1 }];
console.log([...new Set(arr)]);
// [{ a: 1 }, { a: 1 }] - 两个不同对象

// 需要自定义比较逻辑
const unique = [];
arr.forEach(obj => {
if (!unique.some(u => u.a === obj.a)) {
unique.push(obj);
}
});