详解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 相关文章推荐
js下判断 iframe 是否加载完成的完美方法
Oct 26 Javascript
js不完美解决click和dblclick事件冲突问题
Jul 16 Javascript
form表单中去掉默认的enter键提交并绑定js方法实现代码
Apr 01 Javascript
javascript中自定义对象的属性方法分享
Jul 12 Javascript
javascritp添加url参数将参数加入到url中
Sep 25 Javascript
javascript 闭包详解
Jul 02 Javascript
基于jquery实现省市联动效果
Nov 23 Javascript
浅谈js多维数组和hash数组定义和使用
Jul 27 Javascript
Vue动态实现评分效果
May 24 Javascript
mui上拉加载更多下拉刷新数据的封装过程
Nov 03 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
Oct 25 Javascript
Antd中单个DatePicker限定时间输入范围操作
Oct 29 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
php4的彩蛋
2006/10/09 PHP
PHP中str_replace函数使用小结
2008/10/11 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
2015/03/23 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
2017/01/17 PHP
封装好的省市地区联动控件附下载
2007/08/13 Javascript
JavaScript面向对象编程
2008/03/02 Javascript
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
JS检测图片大小的实例
2013/08/21 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
javascript 闭包详解
2015/02/15 Javascript
对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解
2016/04/11 Javascript
js注入 黑客之路必备!
2016/09/14 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
vue服务端渲染的实例代码
2017/08/28 Javascript
jQuery简单实现向列表动态添加新元素的方法示例
2017/12/25 jQuery
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
如何实现iframe父子传参通信
2020/02/05 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
纯JS实现五子棋游戏
2020/05/28 Javascript
分析python服务器拒绝服务攻击代码
2014/01/16 Python
Python中os.path用法分析
2015/01/15 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
在Pycharm中设置默认自动换行的方法
2019/01/16 Python
python绘制动态曲线教程
2020/02/24 Python
Python全面分析系统的时域特性和频率域特性
2020/02/26 Python
详解css3使用transform出现字体模糊的解决办法
2020/10/16 HTML / CSS
绝对经典成功的大学生推荐信
2013/11/08 职场文书
《动手做做看》教学反思
2014/04/09 职场文书
放飞中国梦演讲稿
2014/04/23 职场文书
建筑专业毕业生求职信
2014/09/30 职场文书
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS
Python find()、rfind()方法及作用
2022/12/24 Python