本人菜鸡,前两天去面试,发现再次碰到数组去重这道面试题,比较常见。能够达到去重效果的方法有好几个,感觉有必要整理一下其中几种常见实现:

  1,思路:创建一个空数组,然后循环需要去重的数组,对比创建的数组,如果新创建的数组中不存在当前循环下标值的时候就将它push到新数组中,否则执行下次循环,

     代码如下:

        Array.prototype.distinct = function(){

            //创建一个空数组,专门存放循环时去重数组中每个第一次出现的元素

            var resArr = [];

            for( var i = 0 ; i  < this.length ; i ++ ){

                //判断数组resArr中是否存在当前循环数组中元素

                resArr.indexOf(this[i]) === -1?resArr.push( this [ i ] ):'';

            }

            return resArr;

        }

  2,思路:还是循环需要去重的数组(后面简称oldArr),每次循环oldArr时其中再套一个循环,看外层循环数组的元素在内层循环中是否有再次出现(这个时候

        内层循环的起始值为外层循环的下一个元素下标),如果有再次出现则需要将外层循环下标向前移动一位,且内层循环任然置为外层循环当前下标的

        前一位。如果没有再次出现的话,则表示当前外层循环的元素下标为数组中出现的最后一个相同元素,让后将它放到一个数组里面,就这样循环玩整

        个oldArr,将上述的值依次push到数组里面,然后返回。

   代码如下:

        Array.prototype.dupRem = function(){

            //存放结果的空数组

            var resArr = [];

            for(var i=0;i<this.length;i++){

                  for(var j=i+1;j<this.length;j++){

                        //当外层循环的当前元素在其后面存在相同元素时,外层循环体下标加1

                        if(this[i] === this[j]){

                            j = ++i;

                        }

                  }

                  //将在后续中没有出现的元素放入结果集数组中

                  resArr.push(this[i]);

            }

            return resArr;

        }

  3,思路:这个方法其实与上面的方法方式类似 ,上一个是结果返回一个新数组,不会改变原数组。

    代码如下:

          Array.prototype.dupRem = function(){

              //将操作数组长度保存在一个变量里面

              var len = this.length;

              //外层循环数组

              for(var i = 0;i<len;i++){

                  //内层循环

                  for(var j = i+1;j<len;j++){

                      //同样,当在内层循环中(即在当前数组元素的后面出现相同元素)出现相同元素时,删除该元素

                      if(this[i] === this[j]){

                          this,splice(j,1);  //删除后面的相同元素

                          len --;    //元素删除后,标识数组长度的len也跟随着减1

                          j --;     //元素删除后,为保证循环完整,内层循环下标减1,

                      }

                  }

              }

              return this;    //返回去重处理过后的原数组

          }

    毛病:占内层,速度慢。

  4,思路:利用对象属性不能重复的特性去重。新建一个空对象,将数组元素作为对象键名放入新建的空对象中,每次对象添加新属性时就将属性名push 到一个

       数组里面,最后返回这个数字,结果即为去重后的数组

    代码如下:

          Array.prototype.dupRem = function(){

              var len = this.length,    //将数组元素保存起来

                arr = [],        //存放结果的数组

                obj = {};        //用于判断重复性的对象

              for(var i = 0;i<len;i++){

                  //判断对象中是否存在以当前循环下标为键名的属性,不存在的时候即为第一次出现(后续对比中出现相同元素的时候忽略)

                  if(!obj[this[i]]){

                      obj[this[i]] = '任意值';

                      arr.push = this[i];

                  }

              }

              //返回去重后的结果数组

              return arr;

          }

  5,使用ES6的set数据结构:

        function dopRem(arr){

            return Array.from(new Set(arr));

        }

  

转载于:https://www.cnblogs.com/huangzhenghaoBKY/p/8948039.html

JavaScript中数组去重的几种方法整理相关推荐

  1. JavaScript中数组定义的几种方法,以及关于数组长度的讨论

    大家在使用JavaScript编写脚本语言的时候,尤其是习惯使用Java语言的朋友,定义了一个固定长度的数组,但是使用了一个超出定义数组的元素,程序并没有报"数组越界"错误,这到底 ...

  2. Js中数组去重的几种方法

    前几天在看前端面试题的时候,其中js部分有个问题是实现数组去重的算法,一开始就想了一两种方法,后来仔细回忆了下这个题,觉得该问题实现方法确实不止局限于一两种方法 ,从不同的角度去看待该问题就会有多种实 ...

  3. indexof方法_[ 翻译 ] ES6中数组去重的三种方法

    原文:How to Remove Array Duplicates in ES6 翻译:Hytonight云息 有三种方法可以过滤掉一个数组的重复元素并且返回去重后的新数组.我最喜欢使用Set,因为它 ...

  4. JavaScript数组去重的五种方法

    JavaScript数组去重的五种方法 先简单准备一个数组,用于方法的实验: let array = [1,1,2,3,4,4,1,5,6,6,7,7,7]; console.log(`去重前的数组: ...

  5. 两个对象数组去重的3种方法

    两个对象数组去重的3种方法 前言 问题描述 解决方案一 解决方案二 解决方案三 前言 前段时间写过JavaScript数组去重最简单的 4 种方案,里面的数组元素是基本类型.本文要讲的数组元素是对象, ...

  6. 在JavaScript中反转字符串的三种方法

    This article is based on Free Code Camp Basic Algorithm Scripting "Reverse a String" 本文基于F ...

  7. 中单引号怎么转义_在JavaScript中组合字符串的4种方法

    下面是在JavaScript中组合字符串的4种方法.我最喜欢的方法是使用模板字符串.为什么?因为它更具可读性,所以没有转义引号的反斜杠,没有笨拙的空格分隔符,也没有混乱的加号操作符 . const i ...

  8. java hashmap 去重_java数组去重的两种方法

    我们对于数组元素的使用,有时候在创建数组的初期,并没有考虑过元素的重复问题.当我们想要不重复元素的数组时,就要再进行一步去重的工作.数组的去重有两种方法可以实现,一个是循环比较,另一个是hashSet ...

  9. 数组去重的12种方法总结

    数组去重的11种方法 (1)ES5常用:利用for嵌套for,然后splice去重 function unique(arr) {for (var i = 0; i < arr.length; i ...

最新文章

  1. Java和JavaScript区别与联系
  2. 超强在线考试系统源码(私有部署二次开发)
  3. sqlserver安装显示句柄无效_Sqlserver 2016 R Service环境安装的各种错误(坑)解决办法...
  4. Shiro 实现免密登陆
  5. mysql 指定路径_如何为单个MySQL数据库设置特定的目录位置?
  6. imagenet2012数据集
  7. asp.net如何取得客户端控件的值
  8. Linux (转)解析 xinetd.conf
  9. 后台的Activity被系统回收怎么办?
  10. 手动卸载 出错 无法卸载的 VC++ 运行库
  11. 网络限速软件测试大乐,宽带测速谁靠谱?网速测试软件大对比
  12. ASP.NET AES加密
  13. python中的乘方_python乘方运算
  14. 抖音直播用什么手机效果最好 抖音直播手机哪款好2023
  15. 简单工厂模式-Simple Factory Pattern 工厂三兄弟之简单工厂模式(四):图表库解决方案的改进,简单工厂模式的简化,简单工厂模式总结
  16. PDI(kettle) 阻塞数据直到步骤都完成、Blocking step组件用法及区别
  17. 计算机 usb记录 深度,隐私信息自检查工具-EvidenceToolkit
  18. Python-新浪微博爬虫采集数据
  19. 【目标检测实战学习】从零开始制作并训练自己的VOC数据集,并使用Retinanet进行目标检测
  20. java实现24小时无人直播

热门文章

  1. 【css练习】斑马线表格,美人尖,断线下划线
  2. 【Tensorflow深度学习】Tensorflow2.0GPU版极简安装
  3. 一辆汽车让你搞懂springmvc项目结构
  4. 小程序入门学习20--springboot之集成mybatis
  5. git文件gitignore修改后不生效
  6. 离婚冷静期有用吗?全国哪个省份的情侣最想结婚?大数据告诉你
  7. libspark.swfassist的体会
  8. 鸿蒙os系统测评,鲁大师测试鸿蒙OS2:应用恢复率吊打iOS
  9. mysql 唯一 标识符_mysql – 获取唯一标识符而不插入
  10. 安装ipython(一分钟读懂)