详解JS去重及字符串奇数位小写转大写


Posted in Javascript onDecember 29, 2016

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

一、indexOf()方法

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

//先定义一个数组
 var arr = [,'','',,,,,,,,];
 function remov(array) {
    var arr=[];
    for (var i=,len=array.length;i<len;i++){
      if (arr.indexOf(array[i])==-){
        arr.push(array[i])
      }
    }
    return arr;
 }
 console.log(remov(arr));//[, "", "", , , , , , , ]

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

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

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

var arr = [,'','',,,,,,,,];
 function remov(array) {
     var linArr = [];
     array.sort();
     for (var i = , len = array.length; i < len; i++) {
       if (array[i + ] !== array[i]) {
         linArr.push(array[i])
       }
     }
     return linArr;
   }
   console.log(remov(arr));//["", , , , , "", , , , ]

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

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

var arr = [,'','',,,,,,,,];
 function remov(array) {
     var res = [];
     var obj={};
     for (var i=;i<array.length;i++){
       if(!obj[array[i]]){
         res.push(array[i]);
         obj[array[i]]=;
       }
     }
     return res;
   }
   console.log(remov(arr));//[, "", "", , , , , , ]

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

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

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

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

var arr = [,'','',,,,,,,,]; 
 function remov(array) {
     var obj = {};
     var res = [];
     for (var i=;i<array.length;i++){
       if(!obj[array[i]]){
         obj[array[i]]=;
       }else{
         obj[array[i]]++;
       }
     }
     for (var k in obj){
       res.push(k);//b.这里将遍历的对象属性push到新创建的数组中
 //      console.log(k);//a.直接将遍历的对象的属性打印出来
     }
     return res;//b.这里返回新创建的数组
   }
   console.log(remov(arr));//b.这里将remov(arr)函数的执行结果打印出来["", "", "", "", "", "", "", "", ""]
 //  remov(arr);//a

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

详解JS去重及字符串奇数位小写转大写

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

五、两个for循环来遍历

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

var arr = [,'','',,,,,,,,];
 function remov(array) {
     var res = [];
     for (var i=,len=array.length;i<len;i++){
       var item = array[i];
       for (var j=;j<res.length;j++){
         if (res[j]==item){
           break;
         }
       }
       if (res.length==j){
         res.push(item);
       }
     }
     return res;
   }
   console.log(remov(arr));//[, "", "", , , , , , ]

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

补充一道面试题:

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

var str = 'sdt$^uygGTdgabN';
   document.write(str+"<br/>");//将原字符串输出到文档
   var j=,reg=/[a-zA-Z]/;//j变量用于计数、定义一个正则表达式用来判断是否是字母
   var sArr = str.split("");//将字符串转换成数组
   for (var i=;i<sArr.length;i++){
     if(reg.test(sArr[i])){//如果是字母j++
       j+=;
       if (j%==){//如果是奇数将当前项转换成大写
           sArr[i] = sArr[i].toUpperCase();
       }
     }
   }
   str = sArr.join('');//将数组转换成字符串
   document.write(str);//将转换后的字符串输出到文档

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

详解JS去重及字符串奇数位小写转大写

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jquery的气泡提示效果
May 31 Javascript
基于jQuery实现动态搜索显示功能
May 05 Javascript
javascript url几种编码方式详解
Jun 06 Javascript
深入理解bootstrap框架之第二章整体架构
Oct 09 Javascript
利用Javascript实现简单的转盘抽奖
Feb 13 Javascript
xmlplus组件设计系列之图标(ICON)(1)
May 05 Javascript
vue.js实例todoList项目
Jul 07 Javascript
vue实现自定义H5视频播放器的方法步骤
Jul 01 Javascript
vue前后分离调起微信支付
Jul 29 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
Feb 01 Javascript
JavaScript 声明私有变量的两种方式
Feb 05 Javascript
JavaScript选择器函数querySelector和querySelectorAll
Nov 27 Javascript
bootstrap导航条实现代码
Dec 28 #Javascript
浅谈javascript中的事件冒泡和事件捕获
Dec 28 #Javascript
bootstrap导航、选项卡实现代码
Dec 28 #Javascript
bootstrap提示标签、提示框实现代码
Dec 28 #Javascript
EasyUI折叠表格层次显示detailview详解及实例
Dec 28 #Javascript
一个炫酷的Bootstrap导航菜单
Dec 28 #Javascript
基于bootstrap风格的弹框插件
Dec 28 #Javascript
You might like
PHP/HTML混写的四种方式总结
2017/02/27 PHP
解决laravel 5.1报错:No supported encrypter found的办法
2017/06/07 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
2019/04/16 PHP
JavaScript实现页面实时显示当前时间的简单实例
2013/07/20 Javascript
Chrome下ifame父窗口调用子窗口的问题示例探讨
2014/03/17 Javascript
js判断上传文件类型判断FileUpload文件类型代码
2014/05/20 Javascript
JavaScript 学习笔记之数据类型
2015/01/14 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
js实时获取窗口大小变化的实例代码
2016/11/18 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
详解vue服务端渲染(SSR)初探
2017/06/19 Javascript
angular6.0开发教程之如何安装angular6.0框架
2018/06/29 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
vue如何解决循环引用组件报错的问题
2018/09/22 Javascript
解决ng-repeat产生的ng-model中取不到值的问题
2018/10/02 Javascript
如何在基于vue-cli的项目自定义打包环境
2018/11/10 Javascript
JSON是什么?有哪些优点?JSON和XML的区别?
2019/04/29 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
python控制台英汉汉英电子词典
2020/04/23 Python
Python中多线程的创建及基本调用方法
2016/07/08 Python
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
营销专业应届生求职信
2013/11/26 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
基层党支部整改方案
2014/10/25 职场文书
党员个人党性分析材料
2014/12/18 职场文书
作文评语集锦
2014/12/25 职场文书
幼师辞职信范文大全
2015/05/12 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
python中__slots__节约内存的具体做法
2021/07/04 Python