js中十种数组去重方法,涉及各种数据的去重

	数组去重有各种各样的方法,简单粗暴的我们可以这样写[...new Set(arr)];
而下面的方法考虑到了其他的一些数据,例如连自己都不认识自己的NaN。

	let obj ={};
	let newArr = ['1',1,1,'a','a','b','b','','',obj,obj,null,null,undefined,undefined,{},{},NaN,NaN,'undefined','NaN'];
	//利用es6 set  除了{}之外都能去重
	 Array.prototype.unique = function(){
		return Array.from(new Set(this));
	};
	

	//利用indexOf {}和NaN去不了重但是能区分NaN和字符串'NaN'
	Array.prototype.unique1 = function (){
		
		let newArray = [];
		this.forEach( ele =>{
			// statements
			if(newArray.indexOf(ele) === -1){
				newArray.push(ele);
			};
		});		
		return newArray;
	};
	
	//利用for嵌套
	//除了{}之外都能去重
	Array.prototype.unique2 = function (){
		let newArray;
		for (let i = 0; i < this.length; i++) {		
			for (let j = i+1; j < this.length; j++) {
				//利用es6对象新的扩展方法实现NaN去重
				if ( Object.is(this[i] ,this[j])) {
					this.splice(j,1);
					j--;		
				};
			};
		};
		return newArray = this;
	};
	
	//利用对象属性不重复的特点
	不能识别1 '1' obj  {} 一视同仁
	Array.prototype.unique3 = function (){
		var obj = {};
		var newArray = [];
		this.forEach( function(ele) {
			// statements
			if(!obj[ele]){
				obj[ele] = ' ';
				newArray.push(ele);
			};
		});
		return newArray;
	};
	//利用es6 map数据结构解决1,'1'问题 区分不了{}
	Array.prototype.unique4 = function (){	
		let obj1 = new Map();
		let newArray =[];
		this.forEach( ele=> {
			// statements
			if(!obj1.has(ele)){
				obj1.set(ele,' ')
				newArray.push(ele)
			};
		});
		return newArray;
	};
	
	//利用sort
	// 区分不了{}
	Array.prototype.unique5 = function (){		
		let arr = this.sort();
		let newArray = [arr[0]];
		for (var i = 1; i < arr.length; i++) {
			if (arr[i] !== arr[i-1]) {
				newArray.push(arr[i]);
			};
		};
		return newArray;
	};
	
	//利用includes
	// 区分不了{}
	Array.prototype.unique6 = function (){
		let newArray = [];
		this.forEach(ele => {
			if(!newArray.includes(ele)){
				newArray.push(ele);
			};
		});	
		return newArray;
	};
	
	//利用filter
	// 区分不了{},NaN 与字符串'NaN' 但是能区分NaN与NaN
	Array.prototype.unique7 = function (){
		return this.filter((item, index, arr)=>{
			return Object.is(arr.indexOf(item, 0) , index);
		});
	};
	//利用reduce
	//除了{}
	Array.prototype.unique8 = function (){
		let arr = this.sort();
		let newArray = [];
		let len = arr.length -1;
		arr.reduce((i1,i2)=>{
			if(i1 !== i2){
				newArray.push(i1);
			};
			return i2;
		});
		newArray.push(arr[len]);
		return newArray;
	};
	//利用hasOwnProperty
	//区分不了{} 与定义的obj
	Array.prototype.unique9 = function (){
		let obj = new Map();
		return this.filter( item => {
			return obj.hasOwnProperty(typeof item + item ) ? false : (obj[typeof item + item] = true);
		});
	};
	// 很明显{} === {} 是不可能为true的 还有种方法就是用JSON.stringify 来实现{}的去重  但是这样也不是严格意义上的去重

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值