數組去重 - 創造 101 種方法(上)

     在我們面試的過程中,數組去重,應該算翻牌率極高的題了,結合網上和自己的嘗試,寫了這個測試,整體涉及的知識點極廣且曲徑通幽。
    總結起來,有 101 種方法,999 朵玫瑰 1001 夜,哈哈,我自己都不信,要不我先寫 11 種,接下的 90 種各種看官潑墨揮毫自由發揮!其實,倒也遠不止11種方法,只是在下才疏學淺,只能拋磚引玉,暖暖場子。
     你如果還有更棒的想法,歡迎留言開腦洞,畢竟,你美,說什麼都對!

    在閱讀本文前,建議先去看我寫的《十種方法解決--- 1-100累加和》,其實數組去重跟這個思路很相似!

var arr =['大唐',1,3,2,5,9,"1",5,4,7,0,10,6,8,"大唐","盛世","6",null,undefined,false,true,"false"];

1、indexOf

利用 數組如果不存在該項,indexOf = -1

function demo1(ary){
	var i = 0,
		res = [];
	for (; i < ary.length; i++) {
			res.indexOf(ary[i]) === -1 && res.push(ary[i]);
	}
	console.log(res.sort((a,b)=>a-b));
}
demo1(arr);

結果:["大唐", 0, false, "false", null, "盛世", "1", true, 1, 2, 3, 4, 5, 6, "6", 7, 8, 9, 10, undefined]

 

2、數組索引

數組每一項只有唯一的索引值。
這個方法有個缺點,就是結果會把所有值,轉換成字符串類型

function demo2(ary){
	var i,j,
		cur = [],
		res = [];
	for (i in ary) {
		cur[ary[i]] = 0			
	}
	for (j in cur) {
		res.push(j)				
	}
	console.log(res.sort((a,b)=>a-b));
}
demo2(arr);

結果:["0", "1", "10", "2", "3", "4", "5", "6", "7", "8", "9", "false", "null", "true", "undefined", "大唐", "盛世"]

3、對象屬性

對象內屬性名只能存在唯一的一個,同樣屬性名,後面會覆蓋前面的屬性值
如:var obj = {a:1,b:2,a:3};  console.log(obj.a); //結果:3
缺點同例2,會轉換成字符串類型

function demo3(ary){
    var i,j,
		cur = {},
		res = [];
	for (i in ary) {
		cur[arr[i]] = 0
	}
	for(j in cur){				
		res.push(j)
	}
	console.log(res.sort((a,b)=>a-b));			
}		
demo3(arr);

結果:["0", "1", "10", "2", "3", "4", "5", "6", "7", "8", "9", "false", "null", "true", "undefined", "大唐", "盛世"]

 

4、for 循環

利用兩個 for 遍歷出的值,進行對比,刪除重複項
這一句很關鍵:len = ary.length; 因爲 數組的長度在不斷變化中。

arr = arr.sort(); //可省略
function demo4(ary){
	var j,
		i = 0,
		res = ary,
		len = res.length;
	for (; i < len; i++) {
		for ( j = i + 1; j < len; j++) {
			res[i] === res[j] && res.splice(j,1);
		}
	}
	console.log(res.sort((a,b)=>a-b));
}		
demo4(arr);

結果:[0, "1", 1, 10, 2, 3, 4, 5, "6", 6, 7, 8, 9, false, "false", null, true, "大唐", "盛世", undefined]

 

5、reduce

通過排序,然後 當前項 對比 上一項,如果不同則添加到數組

function demo5(ary){
	var res = [];		
	res = ary.sort().reduce((init, current)=>{				 
		if(init.length === 0 || init[init.length-1] !== current)  {
		 	init.push(current);				 	
		}
		return init;
	},[]);
	console.log(res);
}
demo5(arr);

結果:[0, "1", 1, 10, 2, 3, 4, 5, "6", 6, 7, 8, 9, false, "false", null, true, "大唐", "盛世", undefined]

《數組去重 -  創造 101 種方法 (下)》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章