在JavaScript中,数组去重是一个常见的需求,并且有多种方法可以实现。以下是六种不同的数组去重方法:
1. 使用 Set
数据结构
Set
对象是一种值的集合,每个值在 Set
中只出现一次。
function removeDuplicatesWithSet(arr) {
return [...new Set(arr)];
}
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = removeDuplicatesWithSet(arr);
console.log(uniqueArr); // 输出: [1, 2, 3, 4, 5]
2. 使用 filter
方法
通过 filter
方法检查每个元素是否首次出现。
function removeDuplicatesWithFilter(arr) {
const seen = new Set();
return arr.filter(item => {
return !seen.has(item) && seen.add(item);
});
}
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = removeDuplicatesWithFilter(arr);
console.log(uniqueArr); // 输出: [1, 2, 3, 4, 5]
3. 使用 reduce
方法
通过 reduce
方法累积不重复的元素。
function removeDuplicatesWithReduce(arr) {
return arr.reduce((accumulator, current) => {
if (!accumulator.includes(current)) {
accumulator.push(current);
}
return accumulator;
}, []);
}
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = removeDuplicatesWithReduce(arr);
console.log(uniqueArr); // 输出: [1, 2, 3, 4, 5]
4. 使用 Map
数据结构
类似 Set
,但 Map
存储键值对。
function removeDuplicatesWithMap(arr) {
const map = new Map();
arr.forEach(item => map.set(item, true));
return [...map.keys()];
}
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = removeDuplicatesWithMap(arr);
console.log(uniqueArr); // 输出: [1, 2, 3, 4, 5]
5. 使用两层循环和 splice
通过两层循环比较并删除重复项。
function removeDuplicatesWithLoop(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
arr.splice(j, 1);
j--; // 修正索引
}
}
}
return arr;
}
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = removeDuplicatesWithLoop(arr);
console.log(uniqueArr); // 输出: [1, 2, 3, 4, 5]
6. 使用对象的属性来记录出现过的元素
这种方法利用JavaScript对象的键是唯一的特性。
function removeDuplicatesWithObject(arr) {
const seen = {};
return arr.filter(item => {
return seen.hasOwnProperty(item) ? false : (seen[item] = true);
});
}
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = removeDuplicatesWithObject(arr);
console.log(uniqueArr); // 输出: [1, 2, 3, 4, 5]
总结:每种方法都有其优缺点,选择哪种方法取决于具体的场景和需求。例如,在处理大型数组时,Set
或 Map
通常更为高效,因为它们内部使用了哈希表来存储数据,可以在常数时间内完成查找和添加操作。而使用循环和 splice
的方法在处理大型数组时可能效率较低,因为它涉及到多次数组遍历和修改。