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

一、indexOf()方法

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

 //先定义一个数组
var arr1 = [100,'1','4',5,2,4,67,34,5,78,32];
function remov(array) {
var arr=[];
for (var i=0,len=array.length;i<len;i++){
if (arr.indexOf(array[i])==-1){
arr.push(array[i])
}
}
return arr;
}
console.log(remov(arr1));//[100, "1", "4", 5, 2, 4, 67, 34, 78, 32]

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

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

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

 var arr1 = [100,'1','4',5,2,4,67,34,5,78,32];
function remov(array) {
var linArr = [];
array.sort();
for (var i = 0, len = array.length; i < len; i++) {
if (array[i + 1] !== array[i]) {
linArr.push(array[i])
}
}
return linArr;
}
console.log(remov(arr1));//["1", 100, 2, 32, 34, "4", 4, 5, 67, 78]

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

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

 var arr1 = [100,'1','4',5,2,4,67,34,5,78,32];
function remov(array) {
var res = [];
var obj={};
for (var i=0;i<array.length;i++){
if(!obj[array[i]]){
res.push(array[i]);
obj[array[i]]=1;
}
}
return res;
}
console.log(remov(arr1));//[100, "1", "4", 5, 2, 67, 34, 78, 32]

至于这里为什么将当前项作为对象的一个属性赋值为1,比如说数组中的5,第一次对象中没有5这个属性,我们将其push到新数组中,若不对5这个属性进行赋值,下次检测到第二个5时对象中同样没有又要将其push到新数组中。所以这里将当前项作为对象的一个属性赋值为1,当然也可以赋值为其他值。说的有点啰嗦,懂得人可以略过……

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

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

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

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

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

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

五、两个for循环来遍历

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

 var arr1 = [100,'1','4',5,2,4,67,34,5,78,32];
function remov(array) {
var res = [];
for (var i=0,len=array.length;i<len;i++){
var item = array[i];
for (var j=0;j<res.length;j++){
if (res[j]==item){
break;
}
}
if (res.length==j){
res.push(item);
}
}
return res;
}
console.log(remov(arr1));//[100, "1", "4", 5, 2, 67, 34, 78, 32]

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

补充一道面试题:

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

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

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

JS去重及字符串奇数位小写转大写的更多相关文章

  1. C 字符串奇数位小写字母转大写

    如题 C实现 #include<stdio.h> #include<string.h> #define COUNT 20 //最大接受字符串数,可以使用动态获取空间函数优化 v ...

  2. 前端总结·基础篇·JS(二)数组深拷贝、去重以及字符串反序和数组(Array)

    目录 这是<前端总结·基础篇·JS>系列的第二篇,主要总结一下JS数组的使用.技巧以及常用方法. 一.数组使用 1.1 定义数组 1.2 使用数组 1.3 类型检测 二.常用技巧 2.1 ...

  3. [转]js中的字符串函数集和代码片段

    JS自带函数 concat将两个或多个字符的文本组合起来,返回一个新的字符串.var a = "hello";var b = ",world";var c = ...

  4. JS之路——字符串函数

    JS自带函数concat将两个或多个字符的文本组合起来,返回一个新的字符串.var a = "hello";var b = ",world";var c = a ...

  5. JS生成随机字符串的多种方法

    这篇文章主要介绍了JS生成随机字符串的方法,需要的朋友可以参考下 下面的一段代码,整理电脑时,记录备查. <script language="javascript"> ...

  6. js的数据类型--字符串

    js的数据类型——字符串 这篇我们来说说js的第二种数据类型——字符串. js的内置功能之一就是字符串拼接.如果将加号(+)运算符用于数字,表示两数相加.但将它作用于字符串,则表示字符串拼接,将第二个 ...

  7. Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform

    Expression构建DataTable to Entity 映射委托   1 namespace Echofool.Utility.Common { 2 using System; 3 using ...

  8. md5 32位小写加密源码

    import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * md5 32位小写加密 ...

  9. js如何替换字符串中匹配到多处中某一指定节点?

    抛出一个问题,如图,搜索关键字,匹配到四处,那我鼠标放在第二处,我想把它变个颜色,该怎么实现呢?回到文章的标题,js如何替换字符串中匹配到多处中某一指定节点? 字符串的替换,我们首先想到的一个属性是r ...

随机推荐

  1. ASP.NET Core 之 Identity 入门(三)

    前言 在上一篇文章中,我们学习了 CookieAuthentication 中间件,本篇的话主要看一下 Identity 本身. 最早2005年 ASP.NET 2.0 的时候开始, Web 应用程序 ...

  2. Web大前端时代之:HTML5+CSS3入门系列

    准备来一波新技术,待续.... Old: 联系源码:https://github.com/dunitian/LoTHTML5 文档下载:https://github.com/dunitian/LoTD ...

  3. SQLServer执行命令出现“目录无效的提示”

    异常处理汇总-数据库系列  http://www.cnblogs.com/dunitian/p/4522990.html 一般都是清理垃圾清理过头了,把不该删的目录删了 网上说法: 问题描述: 1.s ...

  4. Linux学习之探索文件系统

    Linux,一起学习进步-    ls With it, we can see directory contents and determine a variety of important file ...

  5. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  6. ASP.NET Core 中文文档 第四章 MVC(4.2)控制器操作的路由

    原文:Routing to Controller Actions 作者:Ryan Nowak.Rick Anderson 翻译:娄宇(Lyrics) 校对:何镇汐.姚阿勇(Dr.Yao) ASP.NE ...

  7. C#开发微信门户及应用(39)--使用微信JSSDK实现签到的功能

    随着微信开逐步开放更多JSSDK的接口,我们可以利用自定义网页的方式来调用更多微信的接口,实现我们更加丰富的界面功能和效果,例如我们可以在页面中调用各种手机的硬件来获取信息,如摄像头拍照,GPS信息. ...

  8. H3 BPM产品安装手册(.Net版本)

    1         安装说明 1.1    服务器安装必备软件 在使用该工作流软件之前,有以下一些软件是必须安装: l  IIS7.0以上版本(必须): l  .Net Framework 4.5(必 ...

  9. 【SAP业务模式】之ICS(五):定价配置

    本篇博文讲述ICS业务中的定价配置. 1.定义销售订单类型 目录:SPRO-销售与分销-销售-销售凭证-销售凭证抬头-定义销售凭证类型 事务代码:VOV8 2.定义销售订单类型 目录:SPRO-销售与 ...

  10. 图解DevExpress RichEditControl富文本的使用,附源码及官方API

    9点半了,刚写到1.2.   该回家了,明天继续写完. 大家还需要什么操作,留言说一下,没有的我明天继续加. 好久没有玩DevExpress了,今天下载了一个玩玩,发现竟然更新到14.2.5了..我去 ...