数组去重
多种 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);
}
});