详解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 slibings选取同级其他元素的实现代码
Nov 15 Javascript
JavaScript通过setTimeout实时显示当前时间的方法
Apr 16 Javascript
Jquery动态添加输入框的方法
May 29 Javascript
浅析创建javascript对象的方法
May 13 Javascript
js获取时间函数及扩展函数的方法
Oct 30 Javascript
解决vue router使用 history 模式刷新后404问题
Jul 19 Javascript
vue-cli项目优化方法- 缩短首屏加载时间
Apr 01 Javascript
Vue实现本地购物车功能
Dec 05 Javascript
JavaScript模板引擎原理与用法详解
Dec 24 Javascript
ES6 新增的创建数组的方法(小结)
Aug 01 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
Sep 24 Javascript
vue相关配置文件详解及多环境配置详细步骤
May 19 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
ftp类(myftp.php)
2006/10/09 PHP
PHP+DBM的同学录程序(3)
2006/10/09 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
php接口实现拖拽排序功能
2018/04/23 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
2020/09/15 PHP
php在linux环境中如何使用redis详解
2020/12/15 PHP
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
2014/03/18 NodeJs
jQuery使用toggleClass方法动态添加删除Class样式的方法
2015/03/26 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
利用Javascript仿Excel的数据透视分析功能
2016/09/07 Javascript
jQuery Ztree行政地区树状展示(点击加载)
2016/11/09 Javascript
json数据处理及数据绑定
2017/01/25 Javascript
Angular实现响应式表单
2017/08/04 Javascript
angular6.0开发教程之如何安装angular6.0框架
2018/06/29 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
vue权限问题的完美解决方案
2019/05/08 Javascript
[41:52]2018DOTA2亚洲邀请赛3月29日 小组赛A组 TNC VS OpTic
2018/03/30 DOTA
Python中多线程及程序锁浅析
2015/01/21 Python
Python实现的redis分布式锁功能示例
2018/05/29 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
python3实现字符串操作的实例代码
2019/04/16 Python
python、Matlab求定积分的实现
2019/11/20 Python
pytorch: Parameter 的数据结构实例
2019/12/31 Python
聊聊python中的异常嵌套
2020/09/01 Python
降低python版本的操作方法
2020/09/11 Python
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
计算机专业毕业生求职信
2014/04/30 职场文书
道路施工安全责任书
2014/07/24 职场文书
公安机关起诉意见书
2015/05/20 职场文书
返乡农民工证明
2015/06/24 职场文书
2015年初中教师个人工作总结
2015/07/21 职场文书
2019年教师节:送给所有老师的祝福语
2019/09/05 职场文书