1. 程式人生 > >TODO-1:6種陣列去重方法-面試題

TODO-1:6種陣列去重方法-面試題

前兩天看到有一個人在總結面試的時候寫到問到了陣列去重,說是方法很多。一時手癢把我能想到的都寫出來了。

1、最傳統的方法,“鏈式”檢索,這個方法雖說是雙層for迴圈巢狀,但是能夠保留陣列原有的順序,對於有順序要求的可以用這個,而且可以相容低版本瀏覽器。

let ary = [2,324,35,2,36,1,2,5,3,51,31,2,5,2,24,5,46,789,0,'2','2'];

function uniq (ary){
	let l = ary.length,
		isRepeat = false,
		res = [];
		
	res[0] = ary[0];

	for(let i = 1; i < l; ++i){
		isRepeat = false;
		for(let j = 0; j < res.length; ++j){
			if(res[j] === ary[i]) {isRepeat =true; break;}
		}
		!isRepeat && res.push(ary[i])
	}
	return res;
}

2、利用物件的屬性不能重複的特性,但是物件的屬性不能保留定義的時候的順序,所以這個方法會破壞原有陣列的順序。

tips:為了防止太多重複,之後的程式碼都只寫關鍵部分,同時用了箭頭函式。

let obj = {};

ary.forEach(e=>{
	if(obj[e] !== e) {res.push(e);obj[e] = e;}
	return true;
})

3、在陣列中檢索,能夠被檢索到便認為是重複,思路感覺跟第一個方法略有些相似

res.push(ary[0]);
ary.forEach(e=>{
	if(res.indexOf(e) == -1) {res.push(e)}
})

4、先將陣列排序,將相鄰相同的值去掉,但是這個只適用於資料型別一致的陣列。當然也破壞了原有的陣列,如果想要不破壞資料來源,可以先拷貝一份。

ary.sort().forEach((e, i, array)=>{
	if(e !== array[i-1]) res.push(e);
})

5、利用資料的篩選和some等方法,主要思路同方法一,但是這個方法的效率應該是不如方法一的,畢竟每次都要拷貝一個新的陣列。

ary.filter((e, i, array)=>!array.slice(i+1).some(ele=>ele === e));

如果想要保證原有的順序,可以先倒序陣列。

ary.reverse().filter((e, i, array)=>!array.slice(i+1).some(ele=>ele === e)).reverse();

6、最後一個是ES6提供的新的資料結構Set。它類似於陣列,但是成員的值都是唯一的,沒有重複的值。

res = [ ...new Set(ary)];

哈哈,是不是看起來炒雞棒!