第一种方法(两两比较)
- 让数组中每个数值跟每个数值比较,如果两值相等(注意此处比较要用到’===’,以防数值是字符串),删除后面的数值(此处删除用到arr.splice(j,1)方法,j是后面数值的索引),但是这个时候原数组的长度会减小一,将j–可解决这个问题。
var arr = [1,1,1,2,2,1];
//第一种方法(两两相比 如果相等删除后面的)
function norepeat(arr){//形参arr和全局变量arr没有关系
for(var i = 0; i < arr.length - 1; i++){
for(var j = i+1; j < arr.length; j++){
if(arr[i]===arr[j]){
arr.splice(j,1);//删除元素之后,原数组是要发生改变的,j正常累加,会有遗漏
j--;
}
}
}
return arr;
}
第二种方法(排序比较)
*先用sort()方法将数组排序,使相同的值在一起,然后将相邻的值依次进行比较判断是否相等(arr[i]===arr[i+1]),两值相等就删除判断的第二个值,原数组发生变化依然用第一种去重中的方法解决。
//第二种方法(先将数组排序,然后第一位和后面一位比较)
var arr = [1,1,1,2,2,2]
function norepeat(arr){
arr.sort();//相同的元素放到一起
for(var i = 0; i < arr.length - 1; i++){
if(arr[i]===arr[i+1]){//两两比较
arr.splice(i+1,1);
i--;
}
}
return arr;
}
第三种方法(创建空对象)
- 结合数组和对象实现数组去重,可以把数组中的元素看成是对象的属性,利用对象里有访问一个不存在的属性,默认取到undefined的原理,在一个空对象中依次取数组中的值,如果得到undefined就说明对象中不存在这个值就将此值放入对象中,若不是undefined说明对象中已经存在此值则不加入对象中,最后返回的对象就是去重的结果。
var arr1 = ["a","a","b","a","c"];
function norepeat(arr){
var newArr = [];//放不重复的元素的
var obj = {};
for(var i = 0; i < arr.length; i++){
if(obj[arr[i]]===undefined){
obj[arr[i]] = 1;
newArr.push(arr[i]);
}
}
return newArr;
}
第四种方法(indexOf())
- 利用数组新增方法indexOf(n)返回n在数组中的索引,没有索引返回-1这一原理,新建一个空数组newArr,遍历需要去重的数组arr,如果arr中的值在newArr中取索引为-1,则说明newArr中还没有这个值,将这个值加到newArr中,若不为-1,就不加,最后返回的newArr就是去重结果。
function norepeat(arr){
var newArr = [];
for(var i = 0; i < arr.length; i++){
if(newArr.indexOf(arr[i])==-1){
newArr.push(arr[i]);
}
}
return newArr;
}
console.log(norepeat(arr));
第五种方法(set())
- 在ES6的基础用法中有个set结构,这是一种新的数据结构,类似数组,它有个特性就是构造函数值不能重复,利用这一特性就能实现数组去重。
var arr=[1,2,5,5,1,6];
let set = new Set(arr);
let newArr=[...set];//函数扩展
console.log(newArr);