每天一个小知识,快速回顾知识点,今天回顾-数组去重的方法
1.假设有一个数组,内部有许多重复的值(今天我们只考虑基本类型的值),需要将其重复的值去掉。
例如:
let arr=[1,1,2,2,3,3,4,4,5,6,7,'9',9]
方案一:利用Set数据结构
let newArr=Array.from(new Set(arr));//需要用Array.from将最后结果转化为数组,毕竟Set只是类数组
//console.log(newArr) [1, 2, 3, 4, 5, 6, 7, '9', 9]
方案二:利用Array.prototype.indexOf()
说明:Array.prototype.indexOf()方法返回数组中第一次出现给定元素的下标,如果不存在则返回 -1。
let newArr=arr.filter((item,index)=>arr.indexOf(item)===index)//我们利用filter这个方法对数组中每一项值进行筛选,那么怎么筛选呢,就是找到数组中第一次出现的元素下标与当前循环时的index与相等时就筛选出去,例如遍历第一个元素时
arr.indexOf(1)返回的是0,此时遍历的下标index正好也是0,所以就将1筛选出去啦,遍历第二个元素时arr.indexOf(1)返回的还是0,但是此时遍历的index下标是1,所以就不会筛选出去。
//console.log(newArr) [1, 2, 3, 4, 5, 6, 7, '9', 9]
方案三:利用Array.prototype.reduce()
let newArr=arr.reduce((pre,next)=>pre.includes(next)?pre:pre.concat(next),[])//初始值为空数组,也是迭代完成后的返回值,判断遍历的下一项在不在数组内,不在就进行添加,如果在就不做处理
//console.log(newArr) [1, 2, 3, 4, 5, 6, 7, '9', 9]
方案四:双重循环去重
const deleteRepeatVal = (arr) => { for (let i = 0, len = arr.length; i < len; i++) { for (let j = i + 1; j < len; j++) { if (arr[i] === arr[j]) { arr.splice(j, 1); j--; len--; } } } return arr; };
方案五:利用es6扩展运算结合Set
let newArr=[...new Set(arr)]//其实和方案一差不多,只是转化数组的方式不同罢了
//console.log(newArr) [1, 2, 3, 4, 5, 6, 7, '9', 9]
方案六:遍历数组,将值作为对象的键进行判断
function deleteRepeatVal(arr) {
let obj = {};
for (let i = 0; i < arr.length; i++) {
if (obj[arr[i]]) { //如果对象的键有值,代表数组里的值重复了,需要将此项删除,并且将i进行--,因为数组长度减少了
arr.splice(i, 1);
i--;
continue;
}
obj[arr[i]] = arr[i];//将值作为obj的键
}
return arr;
}
好啦,今天就回顾这几个数组去重的方法啦,相信大家还有许多其他方法欢迎评论区进行讨论,最后留给大家思考题,今天我们只考虑了数值是基本类型的数组,如果有对象形式的数组又该怎么去重呢?