在编程中,我们经常会遇到需要去除数组中重复元素的问题。无论是笔试题还是实际项目中,掌握有效的数组去重方法都是非常重要的。本文将详细介绍在 ES5 和 ES6 中处理数组去重的几种常见方法,并分析其优缺点。
ES5 中的数组去重方法
嵌套循环去重
这是一种基于比较的去重方法。通过使用两层循环,我们将数组中的每个元素与它后面的元素进行比较。如果发现两个元素相等,就使用 splice 方法删除重复的元素。
function unique(array) {
for (var i = 0; i < array.length; i++) {
for (var j = i + 1; j < array.length; j++) {
if (array[i] === array[j]) {
array.splice(j, 1);
j--;
}
}
}
return array;
}
然而,这种方法的缺点是效率较低,尤其是在处理大型数组时。此外,由于使用的是全等(===)比较,所以无法去除 NaN 和空对象 {}。
indexOf 检查去重
这种方法通过新建一个空数组,然后遍历原数组,对于原数组中的每个元素,检查它是否已经在新数组中存在。如果不存在,就将其添加到新数组中。
function unique(array) {
var arr = [],
tag;
for (var index = 0; index < array.length; index++) {
tag = array[index];
if (!~arr.indexOf(tag)) {
arr.push(tag);
}
}
return arr;
}
这种方法的性能优于嵌套循环去重,但同样无法处理 NaN 和空对象 {} 的去重问题。
ES6 中的数组去重方法
使用 Set 去重
ES6 引入了新的数据结构 Set,它的特点是所有元素都是唯一的,没有重复值。因此,我们可以利用 Set 来轻松地去除数组中的重复元素。
function unique(array) {
return Array.from(new Set(array));
}
这种方法简洁且高效,但对于不支持 Set 的环境则无法使用。
使用扩展运算符和 Set 结合去重
这种方法首先将数组转换为 Set,然后再将 Set 转换回数组。使用扩展运算符可以简化这个过程。
function unique(array) {
return [...new Set(array)];
}
这种方法的优点是代码简洁,但同样依赖于 Set 数据结构。
使用 filter 方法去重
这种方法利用了 JavaScript 的 filter 方法和 indexOf 方法。对于数组中的每个元素,如果它在原数组中第一次出现的位置就是它自身的位置,那么这个元素就是唯一的,将其保留。
function unique(array) {
return array.filter((item, index, arr) => arr.indexOf(item) === index);
}
这种方法在不支持 Set 的环境中仍然可用,但性能可能略低于使用 Set 的方法。
常用去重函数
以下是一个基于对象键名特性进行去重的普遍常用函数,这种方法在 ES5 及以上版本中都可以使用:
function unique(array) {
var obj = {};
return array.filter(function (item) {
return obj.hasOwnProperty.call(obj, item) ? false : (obj[item] = true);
});
}
这个函数的工作原理是利用 JavaScript 对象的键名特性,即对象的键名必须是唯一的。我们创建一个空对象 obj,然后遍历数组 array。对于数组中的每个元素,我们尝试将其作为键添加到对象 obj 中。如果该键已经存在(即元素已经出现过),obj.hasOwnProperty.call(obj, item) 返回 true,过滤函数返回 false,该元素将被过滤掉。如果该键不存在,我们就将其添加到对象中,并返回 true,该元素将被保留。
这种方法的优点是兼容性好,且可以处理 NaN 和空对象 {} 的去重问题。但是,由于涉及到对象属性的查找和设置,对于非常大的数组,性能可能会略低于使用 Set 的方法。此外,需要注意的是,这种方法会改变原始数组元素的顺序,如果需要保持原序,可以结合其他方法或者对结果进行排序。






网友评论