详解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 相关文章推荐
Prototype使用指南之array.js
Jan 10 Javascript
Javascript的闭包
Dec 31 Javascript
潜说js对象和数组
May 25 Javascript
JavaScript中计算网页中某个元素的位置
Jun 10 Javascript
jQuery中队列queue()函数的实例教程
May 03 Javascript
jQuery中选择器的基础使用教程
May 23 Javascript
让你一句话理解闭包(简单易懂)
Jun 03 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
Sep 21 Javascript
JavaScript 中对象的深拷贝
Dec 04 Javascript
如何从零开始利用js手写一个Promise库详解
Apr 19 Javascript
小程序登录/注册页面设计的实现代码
May 24 Javascript
taro 实现购物车逻辑的实例代码
Jun 05 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强制下载类型的实现代码
2011/04/21 PHP
php学习之变量的使用
2011/05/29 PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
php 发送带附件邮件示例
2014/01/23 PHP
php mysql操作mysql_connect连接数据库实例详解
2016/12/26 PHP
Laravel向公共模板赋值方法总结
2019/06/25 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
Google 静态地图API实现代码
2010/11/19 Javascript
jQuery的链式调用浅析
2010/12/03 Javascript
用javascript作一个通用向导说明
2011/08/30 Javascript
jquery复选框全选/取消示例
2013/12/30 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
2015/08/22 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
Vue.JS入门教程之自定义指令
2016/12/08 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
十分钟带你快速了解React16新特性
2017/11/10 Javascript
ElementUI 修改默认样式的几种办法(小结)
2020/07/29 Javascript
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
python实现简易版计算器
2020/06/22 Python
对Python中9种生成新对象的方法总结
2018/05/23 Python
Python中list查询及所需时间计算操作示例
2018/06/21 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
python的slice notation的特殊用法详解
2019/12/27 Python
解决python 找不到module的问题
2020/02/12 Python
自荐信结尾
2013/10/27 职场文书
平安建设实施方案
2014/03/19 职场文书
学校教研活动总结
2014/07/02 职场文书
幸福中国演讲稿
2014/09/12 职场文书
收入证明范本
2015/06/12 职场文书