数组去重的方式练习

news/2024/5/19 23:23:54 标签: js, 数据结构, 函数式编程, 快速排序, 数组

数组去重

方法一

思路:使用indexOf判断新数组是否存在指定的值,不存在就添加,存在就跳过。返回新数组不改变原数组

			var arr2 =[1,5,6,3,2,4,1,5,6,3,2,4,8,9,5,4,22,55,41,23,64];
			function delArrRepeat1(arr){
				var newArr = [];  //定义一个空数组
				for(var i = 0;i<arr.length;i++){
					if(newArr.indexOf(arr[i]) == -1){ // 如果空数组内没有,就添加
						newArr.push(arr[i]);  
					}
				}
				return newArr; //返回新数组
			}
			console.log(delArrRepeat1(arr2))

结果:[1, 5, 6, 3, 2, 4, 8, 9, 22, 55, 41, 23, 64] 会对应原来数组格式

方式二

思路:先给数组排序,用当前值和下一个值比较,如果不等就加入新数组,返回新数组不改变原数组

			var arr2 =[1,5,6,3,2,4,1,5,6,3,2,4,8,9,5,4,22,55,41,23,64];
			function delArrRepeat2(arr){
				// 从小到大排序
				arr.sort((a,b)=>{return a-b});
				var newArr = [];
				for(var i = 0;i<arr.length;i++){
					if(arr[i] !== arr[i+1]){//比较当前和下一个是否相等
						newArr.push(arr[i]);
					}
				}
				return newArr;
			}
			console.log(delArrRepeat2(arr2));

结果:[1, 2, 3, 4, 5, 6, 8, 9, 22, 23, 41, 55, 64] 结果会有排序

方式三

思路:数组每个元素和所有除自生以外的元素进行比较,如果有相同的就删除掉。会改变原数组

			var arr2 =[1,5,6,3,2,4,1,5,6,3,2,4,8,9,5,4,22,55,41,23,64];
			function delArrRepeat3(arr){
			// 每一个元素和所有元素比较一次
				for(var i = 0;i<arr.length;i++){// i表示当前是第几个和所有的比较
					for(var j = 0;j<arr.length;j++){ 
						if(j !== i && arr[i] === arr[j]){ //条件 不和当前比较,并且有全等的就删除掉
							arr.splice(j,1);
						}
					}
				}
				return arr; // 返回原数组
			}
			console.log(delArrRepeat3(arr2));

结果:[1, 5, 6, 3, 2, 4, 8, 9, 22, 55, 41, 23, 64] 会对应原来数组格式

方式四

思路:通过计数,把元素当作下标放在一个新数组里面,通过 for in 来遍历,将新数组下标添加到一个数组里面返回新数组

			var arr2 =[1,5,6,3,2,4,1,5,6,3,2,4,8,9,5,4,22,55,41,23,64];
			function duplicateRemoval(arr){
				var newArray = [],arrs = [];
				//把元素当作下标记录,该元素在数组中出现的次数(主要是把元素当作下标)
				for(var i = 0;i<arr.length;i++){
					newArray[arr[i]] === undefined ? newArray[arr[i]] = 1 : newArray[arr[i]]++;
				}
				for(var i in newArray){arrs.push(i-0);}// 使用 for in 把下标加入到新数组 arrs 中。
				return arrs;
			}
		 	 console.log(duplicateRemoval(arr2));

结果:[1, 2, 3, 4, 5, 6, 8, 9, 22, 23, 41, 55, 64] 会有排序

处理混合数组

比如:var arr2 =[1,5,6,3,2,4,1,5,6,3,2,4,8,9,5,4,22,55,41,23,64,1,'ss','ss',true,true,1,1,{},{},NaN,NaN];

方式二、方式四:主要处理数字类型的数组,处理混合数组会有问题。
方式一、方式三:数字类型混合类型数组

内置对象的函数

使用Set

不改变原数组,返回一个新数组

   var array = [1,5,6,3,2,8,7,3,6,5,4,2,1,5,2];
        function duplicateRemoval(arr){
        // 使用 Array.from()转数组 或者 ... 扩展Set对象转为数组
       	    // return Array.from(new Set(arr));
            return [...new Set(arr)];
        }
        console.log(duplicateRemoval(array)); // [1, 5, 6, 3, 2, 8, 7, 4]

使用 includes

返回新数组,不改变原数组,使用 includes函数判断新数组是否存在,和indexOf思路一致

     let array = [1,5,6,3,2,8,7,3,6,5,4,2,1,5,2];
        function duplicateRemoval(arr){
            let newArr = [],i=0;
            for(;i<arr.length;i++){
                if(!newArr.includes(arr[i])){
                    newArr[newArr.length] = arr[i];
                }
            }
            return newArr;
        }
        console.log(duplicateRemoval(array)); // [1, 5, 6, 3, 2, 8, 7, 4]

使用Map

这个有点小题大做,类似于计数排序,主要是为了练习一下Map ~~~~~QaQ

  let array = [1,5,6,3,2,8,7,3,6,5,4,2,1,5,2];
        function duplicateRemoval(arr){
            let newMap = new Map(),i=0,j=0,newArr = [];
            for(;i<arr.length;i++){ // 把数组的每一项使用值作为键,下标作为值放到Map对象中,利用Map同名属性覆盖的特性去重
                newMap.set(arr[i],i);
            }
            // 然后再把Map对象中的键存储到一个新的数组中返回
            for(let [key,value] of newMap){
                newArr[newArr.length] = key;
            }
            return newArr;
        }
        console.log(duplicateRemoval(array)); // [1, 5, 6, 3, 2, 8, 7, 4]

http://www.niftyadmin.cn/n/1769745.html

相关文章

video的基本使用

video的基本使用效果 播放、暂停、快进、退后、快放、慢放、音量大小、全屏效果。 HTML <section class"box"><article class"tv"><video src"va/4video.webm" id"tvs" controls></video></article>…

canvas个性化时钟

效果演示 简介 十二小时制的时钟&#xff0c;时刻度在圆盘上面显示&#xff0c;交叉线顶角为分和秒的刻度。 时分秒&#xff1a;最小的是秒、中等的是分、圈内的蓝点为时。 中心圆&#xff1a;随着秒钟缩小&#xff0c;数字时钟的显示。 秒钟走动的声音&#xff0c;每小时和每…

art-template整理

官网介绍&#xff1a;art-template是一个简单且超快速的模板引擎&#xff0c;可通过范围内预先声明的技术优化模板渲染速度&#xff0c;从而实现接近JavaScript极限的运行时性能。同时&#xff0c;它同时支持NodeJS和浏览器。在线速度测试。 理解 在使用js进行前端开放的时候&a…

less整理

Less CSS是一门非程序式语言&#xff0c;没有变量、函数、作用域等概念 CSS需要书写大量看似没有逻辑的代码&#xff0c;CSS冗余度是比较高的不方便维护及扩展&#xff0c;复用性不高CSS没有很好的计算能力对开发人员来讲&#xff0c;会因为缺少CSS编写经验而很难写出组织良好…

微信小程序之pinker组件使用以及自动进行相减日期

首先&#xff0c;我这里使用pinker组件代码为 <view class"section"><view class"section__title">开始时间</view><picker mode"date" value"{{date}}" start"{{startTime}}" end"2020-09-01&qu…

微信小程序之一个盒子的padding部分的背景着色问题

今天给一个有padding的盒子&#xff0c;点击它后会添加背景色时候&#xff0c;发现并不能铺满整个盒子&#xff0c;搜索一下padding部分设置属性是不可行的&#xff0c;因为margin和padding只是控制内外边距的&#xff0c;他们本身就是个属性&#xff0c;所以无法在他们上面设置…

微信小程序之view多选

在微信小程序里面不使用checkbox怎么实现view的多选 wxml文件 <block wx:for"{{itemList}}" wx:key"id"><view classitem_container bindtapitemSelected data-index{{index}}><image classselect_icon src"{{item.isSelected?/imag…

VUE项目中main.js、App.vue、import...from...等重要文件的作用和意义

一、main.js 1、 main.js 程序入口文件&#xff0c;初始化vue实例&#xff0c;并引入使用需要的插件和各种公共组件. import Vue from vue import App from ./App import router from ./router import Less from Less Vue.config.productionTip false/* eslint-disable no-new…