JS怎么去重及字符串奇数位小写转大写 JS去重及字符串奇数位小写转大写的教程

面试中经常会考到数组的去重。作为一名合格的前端开发者,不知道几种去重方法是在不应该。废话不多说直接开撸……

一、indexOf()方法

实现思路:使用indexOf()方法来判断新数组中是否有这个值,若没有则将这个值push到数组中

 代码如下 复制代码

//先定义一个数组

vararr = [,'','',,,,,,,,];

functionremov(array) {

   vararr=[];

   for(vari=,len=array.length;i<len;i++){

     if(arr.indexOf(array[i])==-){

       arr.push(array[i])

     }

   }

   returnarr;

}

console.log(remov(arr));//[, "", "", , , , , , , ]

代码很简单,说明一点indexOf()是ES5中的方法,不兼容IE8一下,所以用之前考虑下兼容性问题。

二、sort()+判断相邻两个数

实现思路:先使用数组的sort()方法将数组升序排序,再判断相邻的两个数是否相等,若不相等则将前面的数push到新创建的数组中

 代码如下 复制代码

vararr = [,'','',,,,,,,,];

functionremov(array) {

    varlinArr = [];

    array.sort();

    for(vari = , len = array.length; i < len; i++) {

      if(array[i + ] !== array[i]) {

        linArr.push(array[i])

      }

    }

    returnlinArr;

  }

  console.log(remov(arr));//["", , , , , "", , , , ]

三、创建一个空对象和一个空数组

实现思路:for循环中判断对象中是否有当前项,若没有则将当前项push到新创建的数组中,同时将当前项作为对象的一个属性赋值为1

 代码如下 复制代码

vararr = [,'','',,,,,,,,];

functionremov(array) {

    varres = [];

    varobj={};

    for(vari=;i<array.length;i++){

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

        res.push(array[i]);

        obj[array[i]]=;

      }

    }

    returnres;

  }

  console.log(remov(arr));//[, "", "", , , , , , ]

至于这里为什么将当前项作为对象的一个属性赋值为1,比如说数组中的5,第一次对象中没有5这个属性,我们将其push到新数组中,若不对5这个属性进行赋值,下次检测到第二个5时对象中同样没有又要将其push到新数组中。所以这里将当前项作为对象的一个属性赋值为1,当然也可以赋值为其他值。说的有点??拢??萌丝梢月怨?hellip;…

大家有咩有注意到第三种方法的字符串'4'与数值4这里判断不了,有点小缺憾吧。

四、这种方法与第三种方法借鉴的第三种方法

实现思路:for循环中判断对象中是否有当前项,若没有则将当前项作为对象的一个属性赋值为1,否则当前项++。在for循环完毕后再用for in遍历对象中的属性

 代码如下 复制代码

vararr = [,'','',,,,,,,,];

functionremov(array) {

    varobj = {};

    varres = [];

    for(vari=;i<array.length;i++){

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

        obj[array[i]]=;

      }else{

        obj[array[i]]++;

      }

    }

    for(varkinobj){

      res.push(k);//b.这里将遍历的对象属性push到新创建的数组中

//      console.log(k);//a.直接将遍历的对象的属性打印出来

    }

    returnres;//b.这里返回新创建的数组

  }

  console.log(remov(arr));//b.这里将remov(arr)函数的执行结果打印出来["", "", "", "", "", "", "", "", ""]

//  remov(arr);//a

这种方法有个小疑问:注释里面有a的是将遍历的对象属性直接打印出来结果如下图

注释里面的b是将遍历的对象的属性push到新创建的数组中,结果打印出来的数组中都是字符串。

五、两个for循环来遍历

实现思路:这种方法因该是用的比较多的吧,创建一个空数组,第一次for循环中将一个数组值存到变量item中,在第二次for循环中将新建数组的值与变量比较,若相等则break,第二个for循环完毕后再判断新建数组的长度是否与第二个循环中的j变量相等,若相等则将第一次循环中的item添加到新建的数组中

 代码如下 复制代码

vararr = [,'','',,,,,,,,];

functionremov(array) {

    varres = [];

    for(vari=,len=array.length;i<len;i++){

      varitem = array[i];

      for(varj=;j<res.length;j++){

        if(res[j]==item){

          break;

        }

      }

      if(res.length==j){

        res.push(item);

      }

    }

    returnres;

  }

  console.log(remov(arr));//[, "", "", , , , , , ]

当然还有很多其他的数组去重方法,这里就整理了这么多,有错误或不当之处请指出,大家共同探讨学习。

补充一道面试题:

题目描述:对输入的一串字符串从1开始顺序编号,如果遇到奇数的小写英文字母,则转换成对应的大写字母.若遇到非英文字母字符,不计入奇偶数,但结果要保留该字符

 代码如下 复制代码

varstr ='sdt$^uygGTdgabN';

  document.write(str+"<br/>");//将原字符串输出到文档

  varj=,reg=/[a-zA-Z]/;//j变量用于计数、定义一个正则表达式用来判断是否是字母

  varsArr = str.split("");//将字符串转换成数组

  for(vari=;i<sArr.length;i++){

    if(reg.test(sArr[i])){//如果是字母j++

      j+=;

      if(j%==){//如果是奇数将当前项转换成大写

          sArr[i] = sArr[i].toUpperCase();

      }

    }

  }

  str = sArr.join('');//将数组转换成字符串

  document.write(str);//将转换后的字符串输出到文档

附上转换前与转换后的字符串对比图

时间: 2024-10-29 04:05:12

JS怎么去重及字符串奇数位小写转大写 JS去重及字符串奇数位小写转大写的教程的相关文章

javascript-有哪位大神知道js如何调取手机键盘的高度??高分悬赏(急)

问题描述 有哪位大神知道js如何调取手机键盘的高度??高分悬赏(急) 有哪位大神知道js如何调取手机键盘的高度??不是app而是js调取...期待大神们的答案... 解决方案 https://www.baidu.com/link?url=gQBOGEXypqcfy3ThMRX9I2V0a1qGESo6BPrYeywTzgRN7z-dB-KZdD2P9UQD8-42iZ7bOGCRkBWIMOkYtlSlwaEPLdXmYjTo0YtclP2z2py&wd=&eqid=90db14ec000

c语言-pszBuf为字符串指针,用C语言实现将该字符串中的所有小写字符&amp;amp;#39;a&amp;amp;#39;-&amp;amp;#39;z&amp;amp;#39;转换为大写字符。

问题描述 pszBuf为字符串指针,用C语言实现将该字符串中的所有小写字符'a'-'z'转换为大写字符. 代码中不得调用任何C标准库函数 C语言小白 求解答............................................................................ 解决方案 #include <string.h> void foo(char *pszBuf) { int n = strlen(pszBuf); for (int i = 0; i &l

Ubuntu 16.04 64位中搭建Node.js开发环境教程_node.js

前言 首先说下本文的系统环境是:Ubuntu 16.04 64位,本文内容亲测可用, 大家可以请放心借鉴参考,下面来一起看看详细的步骤. 使用淘宝镜像 淘宝镜像官网是https://npm.taobao.org/ 使用淘宝镜像前请自行安装好 npm 和 node node 和 npm 的安装 node可以在这里下载 本文使用的是官方推荐v4.4.4长期支持版 下载并解压 node-v4.4.4-Linux-x64.tar.xz tar -xJf node-v4.4.4-linux-x64.tar

c语言-《Windows程序设计》书中有句——“字符串「Hello!」中的6个字符占用16位 ”怎么理解?

问题描述 <Windows程序设计>书中有句--"字符串「Hello!」中的6个字符占用16位 "怎么理解? <Windows程序设计>一书中有句话: "字符串「Hello!」中的6个字符占用16位:" 0x0048 0x0065 0x006C 0x006C 0x006F 0x0021 为什么是16位呢? 哪位大牛能够解释? 解决方案 一共8个拉丁字母或半角符号,每个占两位 解决方案二: 16位,16位是两个字节,最多放两个字符,你没看错吧

link中为什么说字符串是只读的,但是我可以改变字符串,这是怎么回事?

问题描述 link中为什么说字符串是只读的,但是我可以改变字符串,这是怎么回事? link中为什么说字符串是只读的,但是我可以改变字符串,这是怎么回事? 解决方案 字符串本来就是只读的.但是它的运算符重载过了,所以用+连接字符串,或者用=赋值,会自动产生一个新的字符串,而不会改变之前的那个. 解决方案二: string是一种很特殊的数据类型,它既是基元类型又是引用类型,在编译以及运行时,.Net都对它做了一些优化工作,正式这些优化工作有时会迷惑编程人员,使string看起来难以琢磨,这篇文章分上

c#-C#字符串中替换指定位置指定长度的子字符串

问题描述 C#字符串中替换指定位置指定长度的子字符串 例如字符串"1abc23abc2abc"要求替换第6位开始长度为3的子字符串"abc"替换为"def"求大神解答,感谢 解决方案 s = "1abc23abc2abc"; s = s.SubString(0, 3) + "def" + s.SubString(6); 解决方案二: public static string Replace(string s

程序题-一个超长字符串表示的十进制数转化为十六进制的字符串

问题描述 一个超长字符串表示的十进制数转化为十六进制的字符串 如题:超长字符串,简单的变成二进制然后每4位变一个十六进制貌似行不通!!

Node.js中创建和管理外部进程详解_node.js

Node被设计用来高效的处理I/O操作,但是你应该知道,有些类型的程序并不适合这种模式.比如,如果你打算用Node处理一个CPU密集的任务,你可能会堵塞事件循环,并因此降低了程序的响应.替代办法是,把CPU密集的任务分配给一个单独的进程来处理,从而释放事件循环.Node允许你产生进程,并把这个新进程做为它父进程的子进程.在Node里,子进程可以和父进程进行双向通信,而且在某种程度上,父进程还可以监控和管理子进程. 另外一种需要使用子进程的情况是,当你想简单地执行一个外部命令,并让Node获取命令

怎样求一个固定4位随机数(字母+数字),且第一位不能为数字0,字母I和O不能在随机数中出现,不能连续两位都出现数字0.应该怎么做?

问题描述 怎样求一个固定4位随机数(字母+数字),且第一位不能为数字0,字母I和O不能在随机数中出现,不能连续两位都出现数字0.应该怎么做? 解决方案 解决方案二:首先构造一个字符串seed,排除了I.O等然后在字符串中随机取,取出来是0的话判断上一个是否也是0解决方案三:不好意思,我看得不是很明白!!是否能说详细点,或者贴段代码上来看看!!麻烦啦!!解决方案四:我一会给你个代码,很容易的.解决方案五:privatestringRandomStr4(){Randomr=newRandom();c

js在vs中调试都正常,生成网站后js失效.新手,请各位高手帮帮忙.

问题描述 <liid="aa"style="visibility:hidden;display:none"><ahref="aa.aspx">test</a></li><scripttype="text/javascript"language="javascript">vara=document.getElementById("limit