人生下来的时候都只有一半,为了找到另外一半而在人世间行走。有的人很幸运,很快就找到了。而有人却要找一生。javascript
最近准备面试中,才发现数组去重都忘了。。。赶忙总结一波,顺便来掘金大半年了,一直在划水。。。萌新第一篇总结,有不对之处,欢迎指正。java
将数组的前一项和后面的每一项进行比较,若是相等,删除后一项,同时数组长度(下标)也要-1面试
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]) {
arr.splice(j,1);
j--;
}
}
}
return arr;
}复制代码
利用ES6的
Set
数据结构拥有惟一值的特性进行数组去重,ps:我这么懒,就喜欢这样代码少的数组
function unique(arr){
if(!Array.isArray(arr)){
throw 'type error'
}
return [...new Set(arr)]
}复制代码
利用
indexOf
检测元素在数组中第一次出现的位置是否和元素如今的位置相等,若是不等则说明该元素是重复元素,利用filter方法筛选出数组中的惟一项,返回排序后的数组数据结构
Array.prototype.unique=function unique(){
//this指当前类的实例,也就是咱们要操做的数组
return this.filter((item,index)=>{
return this.indexOf(item)==index
})
}
var arr1=[1,1,2,5,7,8,0,9,4,4,7,7,7,7,8,1];
console.log( arr1.unique())//(8) [1, 2, 5, 7, 8, 0, 9, 4]复制代码
不改变原有数组ui
建立一个空对象和空数组,循环将数组每一项添加到该对象中,判断若是当前项不在该对象中,则push到空数组中,返回去重后的数组this
Array.prototype.unique=function unique(){
var temp={},arr=[],len=this.length;
for(let i=0;i<len;i++){
if(!temp[this[i]]){
temp[this[i]]=this[i];
arr.push(this[i]);
}
}
return arr
}
var arr1=[1,1,2,5,7,8,0,9,4,4,7,7,7,7,8,1];
console.log( arr1.unique().sort());//(8) [0, 1, 2, 4, 5, 7, 8, 9]复制代码
改变原有数组spa
建立一个空对象,循环将数组每一项添加到该对象中,利用
hasOwnProperty()
判断当前项在不在该对象中,在的话删除,不在就添加,手动释放obj占的堆内存,返回去重后的数组prototype
Array.prototype.unique=function unique(){
var obj={}
for(let i=0;i<this.length;i++){
var item=this[i]
obj.hasOwnProperty(item)?(this.splice(i,1),i--):obj[item]=item
}
obj=null
return this
}
var arr1=[1,1,2,5,7,8,0,9,4,4,7,7,7,7,8,1];
console.log(arr1.unique())//(8) [1, 2, 5, 7, 8, 0, 9, 4]
console.log(arr1)//(8) [1, 2, 5, 7, 8, 0, 9, 4]复制代码
数组去重方法有不少种,孰优孰劣,还要根据具体使用场景判断,另外上述对于数组原型方法的扩展,因为返回的仍是一个数组,能够链式操做,比较方便(b格高。。。)。以上就是个人首发了,紧张兮兮。。。code