JS 数组去重的方法
方法一:多层循环比较
利用splice的特性,比较两个数是否相同,获得相同元素的下标,删除相同元素,改变原数组,获得去重后的数组
function uniqueArr(arr){
for(var i = 0;i < arr.length ;i++){
for(var j = i + 1;j < arr.length - 1; j++){
if(arr[i] == arr[j]){
arr.splice(j,1);
}
}
}
return arr;
}
方法二:利用indexOf()
设置一个新的数据用来接收数据,利用indexOf 来判断 数据是否存在于 新数组中,不存在,则添加进去,获得去重后的新数组
function uniqueArr(arr){
var newArr = [];
for(var i = 0;i < arr.length;i++){
if(newArr.indexOf(arr[i]) < 0){
newArr.push(arr[i]);
}
}
return newArr;
}
方法三:对象键值对法
定义一个对象,用数组中的元素作为对象属性名,如果对象名不存在,那么将该元素添加到新数组中,给对应的属性值 设置 一个值作为标记,不一定为1,获得去重后的新数组
function uniqueArr(arr){
var obj = {};
var newArr = [];
for(var i = 0;i < arr.length;i++){
if(!obj[arr[i]]){
obj[arr[i]] = 1;
newArr.push(arr[i]);
}
}
return newArr;
}
function uniqueArr(arr,attr){
var attr_arr = [];
var newArr = [];
arr.forEach(function(item,index){
if(attr_arr.indexOf(item[attr]) < 0){
newArr.push(item);
attr_arr.push(item[attr]);
}
})
return newArr;
}
方法四:
定义一个新数组,将 arr 的第一个值添加到新数组中作为比较对象,遍历从数组的第二个值开始逐一比较 push 后的新数组中每个元素比较,看是否有相同的,不同就添加,获得不重复新数组
function uniqueArr(arr){
var newArr = [arr[0]];
for(var i = 1;i < arr.length;i++){
var flag = false;
for(var j = 0;j < newArr.length;j++){
if(newArr[j] === arr[i]){
flag = true;
break;
}
}
if(!flag) newArr.push(arr[i]);
}
return newArr;
}
方法五:先排序,再相邻两两比较
function uniqueArr(arr){
arr.sort();
for(var i = 0;i < arr.length;i++){
if(arr[i] === arr[i-1]){
arr.splice(i,1);
}
}
return arr;
}
方法六:利用indexOf和 lastIndexOf方法判断
利用indexOf() 方法的特性,从数组下标0开始查找元素,返回第一次出现位置的下标,lastIndexOf() 从数组末尾开始查找元素,返回从后向前找到元素的第一次出现位置的下标。
如果从数组开始进行查找 的元素和从后进行查找的元素 下标相同,表示找到的是同一个元素。
function uniqueArr(arr){
for(var i = 0;i < arr.length;i++){
if( arr.indexOf(arr[i]) !== arr.lastIndexOf(arr[i])){
arr.splice(arr.lastIndexOf(arr[i]),1);
}
}
return arr;
}
方法七:ES6 Set()方法
new Set() 方法不允许有重复数据,但是返回的是一个类数组,所以要用 Array.from()方法转换成数组
function uniqueArr(arr){
return Array.from(new Set(arr));
}