怎樣用一個方法去掉一個數組的重復元素


今天在網上看到這個問題,所以我也嘗試一下用幾種不同的方法來解決這個問題。感謝您的查看,如有不足請指出。

1.遍歷數組法

思路:首先想到的一個方法是遍歷,將整個數組遍歷一遍,如果之前沒有出現過,將其放到一個新的數組中,最后返回這個數組。

function unique(array){
	var n = [];//一個新的臨時數組
	//遍歷當前數組
	for(var i=0; i<array.length; i++){
		//如果當前數組的第i已經保存進了臨時數組,那么跳過,
		//否則把當前項push到臨時數組里面
		if(n.indexOf(array[i]) == -1){
			n.push(array[i]);
		}
	}
	return n;
}

//判斷瀏覽器是否支持indexOf,indexOf為ecmaScript5新方法IE8以下(包括IE8,IE8只支持部分ecma5)不支持

if(!Array.prototype.indexOf){
	//新增indexOf方法
	Array.prototype.indexOf = function(item){
		var result = -1;
		var a_item = null;
		if(this.length == 0){
			return result;
		}
		for(var i = 0,len = this.length; i < len; i++){
			a_item = this[i];
			if(a_item === item){
				result = i;
				break;
			}
		}
		return result;
	}
}

2.對象鍵值對法

該方法實現的思路比其他任何方法都快,就是占用的內存大一些;

思路:新建一js對象以及新數組,遍歷傳入數組時,判斷值是否為js對象的鍵,不是的話給對象新增該鍵並放入新數組。注意點:判斷是否為js對象鍵時,會自動對傳入的鍵執行“toString()”,不同的鍵可能會被誤認為一樣;例如:a[1],a["1"]。解決上述問題還得調用"indexOf"。
funcion unique2(array){
	var n = {}; 
	var r = [];
	var len = arr.length;
	var val,type;
	for(var i = 0; i<len; i++){
		val = array[i];
		type = typeof val;
		if(!n[var]){
			n[val] = type;
			r.push(val);
		} else if(n[val].indexOf(type) < 0){
			n[val].push(type);
			r.push(val);
		}
	}
	return r;
}

3.數組下標判斷法

還是得用“indexOf”性能跟方法1差不多

思路:如果當前數組的第i項在當前數組中第一次出現的位置不是i,那么表示第i項是重復的,忽略掉。否則存入結果數組。
function unique3(array){
	var n = [array[0]];//結果數組
	//從第二項開始遍歷
	for(var i = 1; i<array.length; i++){
		//如果當前數組的第i項在當前數組中第一次出現的位置不是i;
		//那么表示第i項是重復的,忽略掉。否則存入結果數組。
		if(array.indexOf(array[i]) == i){
			n.push(array[i]);
		}
	}
	return n;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM