本文详细总结了JavaScript中实现数组去重的八种常用方法,包括利用对象属性、Set数据结构、Sort排序、Filter过滤、Map对象以及Reduce累加器等技巧。每种方法均附带完整可运行的代码示例,帮助开发者根据实际场景选择最优方案,提升前端数据处理效率。
引言:数组去重的应用场景与重要性
数组去重通常出现在面试场景中,要求手写实现数组去重方法的代码。若被问及数组去重的方法有哪些,能列举出其中的10种,面试官可能会对你刮目相看。 在实际项目中,数组去重多由后端处理,前端较少涉及。尽管日常开发中使用频率不高,但仍需了解,以应对可能的面试提问。
1. 利用对象的属性
该方法基于对象属性名唯一性的原理进行去重。
方法一:利用对象属性去重
var arr = ['qiang','ming','tao','li','liang','you','qiang','tao'];
console.time("nonredundant1");
var nonredundant1 = Object.getOwnPropertyNames(arr.reduce(function(seed, item, index) {
seed[item] = index;
return seed;
},{}));
console.timeEnd("nonredundant1");
console.log(nonredundant1);
运行结果如下:

2. 使用Set数据结构
Set是一种类似数组的结构,其成员值均唯一,不允许重复。通过Set构造函数可以接收数组或类数组参数来生成Set对象。随后,利用Array.from方法将Set对象转换为真正的数组,该方法适用于将类似数组的对象(如ES6新增的Set和Map结构)转换为数组。
方法二:使用Set数据结构去重
var arr = ['qiang','ming','tao','li','liang','you','qiang','tao'];
function unique (arr) {
return Array.from(new Set(arr))
}
console.time("nonredundant2");
var nonredundant2 = unique(arr);
console.timeEnd("nonredundant2");
console.log(nonredundant2);
运行结果如下:

3. 使用for循环结合splice方法
方法三:for循环与splice结合去重
function unique(arr) {
for (var i = 0; i < arr.length; i++) {
for (var j = i + 1; j < arr.length; j++) {
if (arr[i] == arr[j]) { //第一个等同于第二个,splice方法删除第二个
arr.splice(j, 1);
j--;
}
}
}
return arr;
}
console.time("nonredundant3");
var arr = ['qiang', 'ming', 'tao', 'li', 'liang', 'you', 'qiang', 'tao'];
var nonredundant3 = unique(arr);
console.timeEnd("nonredundant3");
console.log(nonredundant3);
运行结果如下:

4. 使用indexOf判断去重
方法四:indexOf判断去重
function unique(arr) {
var array = [];
for (var i = 0; i < arr.length; i++) {
if (array .indexOf(arr[i]) === -1) {
array .push(arr[i])
}
}
return array;
}
var arr = ['qiang', 'ming', 'tao', 'li', 'liang', 'you', 'qiang', 'tao'];
console.time("nonredundant4");
var nonredundant4 = unique(arr);
console.timeEnd("nonredundant4");
console.log(nonredundant4);
运行结果如下:

5. 使用sort排序后去重
方法五:sort排序后去重
function unique(arr) {
arr = arr.sort()
var arrry = [arr[0]];
for (var i = 1; i < arr.length; i++) {
if (arr[i] !== arr[i - 1]) {
arrry.push(arr[i]);
}
}
return arrry;
}
var arr = ['qiang', 'ming', 'tao', 'li', 'liang', 'you', 'qiang', 'tao'];
console.time("nonredundant5");
var nonredundant5 = unique(arr);
console.timeEnd("nonredundant5");
运行结果如下:

6. 使用filter过滤去重
方法六:filter过滤去重
function unique(arr) {
var obj = {};
return arr.filter(function(item, index, arr){
return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
})
}
var arr = ['qiang', 'ming', 'tao', 'li', 'liang', 'you', 'qiang', 'tao'];
console.time("nonredundant6");
var nonredundant6 = unique(arr);
console.timeEnd("nonredundant6");
console.log(nonredundant6);
运行结果如下:

7. 使用Map数据结构去重
方法七:Map数据结构去重
function unique(arr) {
let map = new Map();
let array = new Array(); // 数组用于返回结果
for (let i = 0; i < arr.length; i++) {
if (map.has(arr[i])) { // 如果有该key值
map.set(arr[i], true);
} else {
map.set(arr[i], false); // 如果没有该key值
array.push(arr[i]);
}
}
return array;
}
var arr = ['qiang', 'ming', 'tao', 'li', 'liang', 'you', 'qiang', 'tao'];
console.time("nonredundant7");
var nonredundant7 = unique(arr);
console.timeEnd("nonredundant7");
console.log(nonredundant7);
运行结果如下:

8. 使用reduce和include逻辑去重
方法八:reduce与include逻辑去重
function unique(arr){
return arr.reduce((prev,cur) => prev.includes(cur) ? prev : [...prev,cur],[]);
}
var arr = ['qiang', 'ming', 'tao', 'li', 'liang', 'you', 'qiang', 'tao'];
console.time("nonredundant8");
var nonredundant8 = unique(arr);
console.timeEnd("nonredundant8");
console.log(nonredundant8);
运行结果如下:

本文介绍了JavaScript中常用的数组去重实战源码,更多相关JS数组去重内容可搜索本站历史文章或继续浏览后续文章,感谢大家的支持。