人生下來的時候都只有一半,爲了找到另外一半而在人世間行走。有的人很幸運,很快就找到了。而有人卻要找一生。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