js中数组的去重方法总结(比较全)

//数组去重
			//方法一:使用indexOf
			function test1(arr){
				var tmp=[];
				for(let i=0;i<arr.length;i++){
					if(tmp.indexOf(arr[i])==-1){
						tmp.push(arr[i])
					}
				}
				return tmp;
			}
			//方法二:Set (ES6中最常用)
			function test2(arr){
				return Array.from(new Set(arr));
			}
			//方法三:对象键值法(速度快,占空间最多)
			// 写一个空对象,把数组中的每一位当做对象的属性名,
			// 利用对象的特性(同一属性名不可以出现两次)先把第一位当做属性名添加进去,
			// 属性值随便写一个,再看第二位,如果第二位在对象中有属性名,就看下一位,
			// 如果对象中没有属性名,就把这个值添加进去当属性名,只看对象的属性名,就去重了,
			// 这个方法叫做hash
			function test3(arr){
				var res=[];
				var obj={};
				for(let i=0;i<arr.length;i++){
					// console.log(!obj[arr[i]]);
					if(!obj[arr[i]]){
						obj[arr[i]]=true;
						res.push(arr[i]);
					}
				}
				return res;
			}
			var arr=[2,3,5,2,3,2];
			// console.log(test3(arr));
			//对象去重
			var arr1=[
				        { id: 1, name: 'a' },
				        { id: 1, name: 'f' },
				        { id: 2, name: 'b' },
				        { id: 3, name: 'a' },
				        { id: 3, name: 'g' },
				        { id: 4, name: 'd' },
				        { id: 5, name: 'e' },
			]
			console.log(obj5(arr1));
			//1.双重for循环
			function obj1(arr1){
				for(let i=0;i<arr1.length-1;i++){
					for(let j=i+1;j<arr1.length;j++){
						if(arr1[i].id==arr1[j].id){
							arr1.splice(j,1);
							j--;
						}
					}
				}
				return arr1;
			}
			//2.借助对象的访问属性的方法
			// obj中没有则添加 this.arr[i].id 这个key,并把值设为true,后续相同则不添加
			function obj2(arr1){
				var obj={};
				var res=[]
				for(let i=0;i<arr1.length;i++){
					if(!obj[arr1[i].id]){
						res.push(arr1[i]);
						obj[arr1[i].id]=true;
					}
				}
				return res;
			}
			//3.reduce方法
			function obj3(arr1){
				var obj={};
				return arr1=arr1.reduce((item,next)=>{
					obj[next.id] ? '':obj[next.id]=true&&item.push(next);
					return item;
				},[]);
			}
			//4.Map()
			// has方法可以判断Map对象中是否存在指定元素,有则返回true,否则返回false
            // set方法可以向Map对象添加新元素 map.set(key, value)
            // values方法可以返回Map对象值的遍历器对象
			function obj4(arr1){
				let map=new Map();
				for(let i of arr1){
					if(!map.has(i.id)){
						map.set(i.id,i)
					}
				}
				arr1=[...map.values()]
				return arr1;
			}
			//5.every()
			// every() 方法用于检测数组所有元素是否都符合指定条件
			// 所有元素都满足条件,则返回 true,有一个元素不满足,则返回 false ,且剩余的元素不会再进行检测
			function obj5(arr1){
				let brr=[];
				arr1.forEach(function(a){
					let istrue=brr.every(function(b){
						return a.id!=b.id;
					})
					istrue ? brr.push(a):''
				})
				return brr;
			}
		
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值