一般的方法此处也不列举了
本文中介绍了多种数组去重的方法,使用了较多的高阶方法及API,并给出相应解释及语法,还有其他多种组合调用方式,原理逻辑其实都差不多
// 给定一个数组
let arr = [1,2,2,4,null,null,'3','abc',3,5,4,1,2,2,4,null,null,'3','abc',3,5,4]
一、利用对象的 key 唯一
众所周知,对象的key不可重复,否则后者将覆盖前者。利用该特性,实现数组去重,遍历数组,将数组的每一项做为对象的key值。
// 给定一个数组
let arr = [1,2,2,4,null,null,'3','abc',3,5,4,1,2,2,4,null,null,'3','abc',3,5,4]
let obj = {};
for (let i = 0; i < arr.length; i++) {
let item = arr[i]
if (obj[item] !== undefined) {
arr.splice(i, 1);
i--; // 解决删除元素后,数组塌陷问题
continue;
}
obj[item] = item
}
二、交换元素位置从而替换调 splice方法
方法存在一定的性能问题,也就是说,基于splice实现删除性能不太好,当前项被删除后,随后每一项的索引都要向前移动一位,数据量较庞大时,一定会影响性能
let obj = {};
for (let i = 0; i < arr.length; i++) {
let item = arr[i]
if (obj[item] !== undefined) {
arr[i] = arr[arr.length-1]
arr.length--;
i--;
continue;
}
obj[item] = item
}
// arr: [1, 2, 4, null, "3", "abc", 3, 5]
三、Array.filter + Array.indexOf
filter() 方法:创建一个新数组,新数组中的元素是指定数组中符合某种条件的所有元素。如果没有符合条件的元素则返回空数组
//filter() 不会对空数组进行检测。
//filter() 不会改变原始数组。
//原理:返回 item 第一次出现的位置等于当前的index的元素
let newArr = arr.filter((item, index) => arr.indexOf(item) === index);
四、Array.filter + Object.hasOwnProperty
hasOwnProperty() 方法:返回一个布尔值,表示对象自身属性中是否具有指定的属性
//filter() 不会对空数组进行检测。
//filter() 不会改变原始数组。
//原理:利用对象的键名不可重复的特点
let obj = {}
arr.filter(item => obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true))