前言
JavaScript 中实现数组去重的方法有很多种,下面列举一些常见的解决方案。
使用 Set
let array = [1, 2, 3, 4, 4, 5, 6, 5, 7];
let uniqueArray = [...new Set(array)];
console.log(uniqueArray);
Set
是 ES6 引入的新的数据结构,它不允许重复值,所以可以直接将数组转换为 Set
再转回数组达到去重目的。
利用 filter
方法
let array = [1, 2, 3, 4, 4, 5, 6, 5, 7];
let uniqueArray = array.filter((value, index, self) => {
return self.indexOf(value) === index;
});
console.log(uniqueArray);
此方法通过 filter
函数遍历数组,并利用 indexOf
检查当前元素在原数组中的索引是否等于当前遍历到的索引,如果不是则保留该元素。
双层循环法
let array = [1, 2, 3, 4, 4, 5, 6, 5, 7];
let uniqueArray = [];
for (let i = 0; i < array.length; i++) {
if (uniqueArray.indexOf(array[i]) === -1) {
uniqueArray.push(array[i]);
}
}
console.log(uniqueArray);
这种方法创建一个新的空数组,然后遍历原数组,若新数组中没有当前元素,则添加进去。
使用 reduce
let array = [1, 2, 3, 4, 4, 5, 6, 5, 7];
let uniqueArray = array.reduce((accumulator, currentValue) => {
return accumulator.includes(currentValue) ? accumulator : [...accumulator, currentValue];
}, []);
console.log(uniqueArray);
reduce
方法可以用来简化数组操作,这里同样是检查累计器(accumulator)中是否已包含当前值,不包含的话就将其添加进结果数组。
利用对象键值特性
let array = [1, 2, 3, 4, 4, 5, 6, 5, 7];
let obj = {};
let uniqueArray = array.filter(item => {
return !obj[item] ? (obj[item] = true) : false;
});
console.log(uniqueArray);
这种做法是利用 JavaScript 对象的键名唯一性,遍历数组时将元素作为对象的键存入,如果元素已经存在,则 obj[item]
的值会是 true
,因此过滤函数返回 false
,从而去除重复项。
ES6 Map
let array = [1, 2, 3, 4, 4, 5, 6, 5, 7];
let uniqueArray = [...new Map(array.map(item => [item, item])).values()];
console.log(uniqueArray);
与使用 Set
类似,这里是先将数组映射成键值对(键和值相同),然后转换为 Map
,最后获取其所有值(即去重后的数组)
总结
根据实际场景和兼容性需求选择适合的方法。在现代浏览器或支持 ES6+ 特性的环境中,推荐使用 Set
或 Map
方式,它们不仅简洁而且性能较好。