一、数组去重的方法
var array= [1,2,2,4,9,6,7,5,2,3,5,6,5];
1、利用for循环,indexOf()方法
function unique(array){ var temp = []; //一个新的临时数组 for(var i = 0; i < array.length; i++){ if(temp.indexOf(array[i]) == -1){ temp.push(array[i]); } } return temp; }
2、对象键值法去重(原生JS)
function unique(array){ var temp = {}, r = [], len = array.length, val, type; for (var i = 0; i < len; i++) { val = array[i]; type = typeof val; if (!temp[val]) { temp[val] = [type]; r.push(val); } else if (temp[val].indexOf(type) < 0) { temp[val].push(type); r.push(val); } } return r; }
备注:该方法执行的速度比其他任何方法都快, 就是占用的内存大一些。 思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。 注意点:判断是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为一样,例如n[val]-- n[1]、n["1"],解决上述问题还是得调用“indexOf”。
3、reduce()方法,include()方法(ES6)
let result=array.reduce((prev,item)=>{
//.includes() 判断数组中是否含有指定元素 有 返回T 没有F
if(!prev.includes(item)){
prev.push(item)
}
return prev
},[])
4、利用ES6中的Set去重
function uniqe(arr){
return Array.from(new Set(arr))
}
也可以使用...(拓展运算符)
function uniqe(arr){
return [...new Set(arr)]
}
缺点:无法去除空对象
5、利用双重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; }
6、利用sort排序,然后在前后比对
function unique(arr) { if (!Array.isArray(arr)) { //先判断是否是数组 console.log('type error!') return; } 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; }
7、利用filter过滤,将不是第一次出现的过滤掉,使用indexOf()知道第一次出现的下标
function unique(arr) { return arr.filter(function(item, index, arr) { //当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素 return arr.indexOf(item, 0) === index; }); }
简写
function unique(arr) { return arr.filter((item, index, arr) => arr.indexOf(item, 0) === index); }