1、方法一:双层循环,外层循环元素,内层循环做比较,若相同则跳过,不同则加入结果集中,获取没重复的最右侧的值放入数组中
Array.prototype.distinct = function(){ var arr = this; var result = []; var len = arr.length; for(var i=0;i<len;i++){ for(var j=i+1;j<len;j++){ if(arr[i]===arr[j]){ j = ++i;//出现相同的值,将j置为++i,即进入新一轮的循环 } } result.push(arr[i]) } return result; }
2、方法二:利用splice直接在原数组中删除
Array.prototype.distinct = function(){ var arr = this, len = arr.length; for(var i=0;i<len;i++){ for(var j = i+1; j<len;j++){ if(arr[i]===arr[j]){ arr.splice(i,1); len--; j--; } } } return arr; }
3、方法三:利用对象属性不能重复的特点去重
Array.prototype.distinct = function(){ var arr = this; var len = arr.length; var obj = {} var result = [] for(var i =0 ;i<len;i++){ //if(!obj[arr[i]]){ if(!obj.hasOwnProperty(arr[i])){ obj[arr[i]] = 1; result.push(arr[i]) } } return result }
4、方法四:利用数组进行排序
Array.prototype.distinct = function(){ var arr = this; var len = arr.length; arr.sort(function(a,b){ return a-b; }) function loop(index){ if(index>=1){ if(arr[index] === arr[index-1]){ arr.splice(index,1) } loop(index-1) } } loop(len-1) return arr; }
5、方法五:遍历数组,利用indexOf判断
Array.prototype.distinct = function(){ var arr = this; var len = arr.length; var result = []; arr.forEach(function(currentVal,index,arr){ //arr.map(function(currentVal,index,arr){ var loop = result.indexOf(currentVal) if(loop === -1){ result.push(currentVal) } }) return result }
6、方法六:es6的set数据结构,set成员都是唯一的,Array.form可以将set类型转化为数组
Array.prototype.distinct = function(){ return Array.from(new Set(this)) //或者使用es6的三点运算符转化为数组 [...new Set(this)] }