数组去重很简单,大都运用数组的属性和方法,有很简单的,有复杂的,今天分享几个数组去重的方法。es6
原理就是建立一个临时数组,循环有重复的数组,判断这个临时数组是否有这个元素,没有就push进去,有就不要。数组
var arr = ['a', 8, 10, 'd', 20, 'f', 'd', 10, 'a'];
var tempArr = [];
复制代码
IndexOf,中间数组要是没有这个值就push:bash
for(var i = 0;i < arr.length;i++){
if(tempArr.indexOf(arr[i]) == -1){
tempArr.push(arr[i]);
}
}
复制代码
Includes,es6方法,也是中间数组没有这个值就push:函数
for(var i = 0;i < arr.length;i++){
if(!tempArr.includes(arr[i])){
tempArr.push(arr[i]);
}
}
复制代码
角标IndexOf,indexOf会返回第一个目标元素的角标,若是当前角标不等于第一个得到的角标,表示是重复的:ui
for(var i = 0;i < arr.length;i++){
if(arr.indexOf(arr[i]) == i){
tempArr.push(arr[i]);
}
}
复制代码
先排序再去重,排序完以后,相等的就会相邻,循环排序结果的数组,跟中间数组的最后一个比较,若是没有就push:spa
var sortArr = arr.sort();
var tempArr = [sortArr[0]];
for(var i = 1; i < sortArr.length; i++){
if(sortArr[i] != tempArr[tempArr.length-1]){
tempArr.push(sortArr[i]);
}
}
复制代码
最兼容,循环两个数组,设定一个标识,要是去重数组内容在中间数组里面找不到就push进去:code
for(var i = 0;i < arr.length;i++){
var flag = false;
for(var j = 0;j < tempArr.length;j++){
if(arr[i] == tempArr[j]){
flag = true;
break;
};
}
if(!flag){
tempArr.push(arr[i]);
};
}
复制代码
经过对象属性不能重复特色,当没有这个属性的时候就push进去,切这个对象也要添加这个下标属性:cdn
var obj = {};
for(var i = 0;i < arr.length;i++){
if(!obj[arr[i]]){
obj[arr[i]] = true;
tempArr.push(arr[i]);
}
}
console.log(tempArr);//["a", 8, 10, "d", 20, "f"]
ES6set和from:
console.log(Array.from(new Set(arr)));//["a", 8, 10, "d", 20, "f"]
复制代码
其实数组去重的方法原理都是利用中间数组去比较,无论用includes仍是indexOf,原理都是同样的。还有用其余遍历函数的方法,好比map、filter等,也能实现,可是原理都同样。对象
Coding 我的笔记排序