专栏首页coding个人笔记数组去重的几个方法

数组去重的几个方法

数组去重很简单,大都运用数组的属性和方法,有很简单的,有复杂的,今天分享几个数组去重的方法。

原理就是创建一个临时数组,循环有重复的数组,判断这个临时数组是否有这个元素,没有就push进去,有就不要。

var arr = ['a', 8, 10, 'd', 20, 'f', 'd', 10, 'a'];
var tempArr = [];
IndexOf,中间数组要是没有这个值就push:
for(var i = 0;i < arr.length;i++){ 
 if(tempArr.indexOf(arr[i]) == -1){ 
   tempArr.push(arr[i]); 
 }
}
Includes,es6方法,也是中间数组没有这个值就push:
for(var i = 0;i < arr.length;i++){ 
 if(!tempArr.includes(arr[i])){ 
 tempArr.push(arr[i]); 
 }
}

角标IndexOf,indexOf会返回第一个目标元素的角标,如果当前角标不等于第一个获得的角标,表示是重复的:

for(var i = 0;i < arr.length;i++){ 
 if(arr.indexOf(arr[i]) == i){ 
  tempArr.push(arr[i]); 
 }
}

先排序再去重,排序完之后,相等的就会相邻,循环排序结果的数组,跟中间数组的最后一个比较,如果没有就push:

var sortArr = arr.sort();
var tempArr = [sortArr[0]];
for(var i = 1; i < sortArr.length; i++){ 
   if(sortArr[i] != tempArr[tempArr.length-1]){ 
     tempArr.push(sortArr[i]); 
    }
}

最兼容,循环两个数组,设定一个标识,要是去重数组内容在中间数组里面找不到就push进去:

for(var i = 0;i < arr.length;i++){ 
 var flag = false;
  for(var j = 0;j < tempArr.length;j++){ 
    if(arr[i] == tempArr[j]){ 
      flag = true;
break; 
  }; 
 } 
if(!flag){ 
     tempArr.push(arr[i]); 
 };
}

通过对象属性不能重复特点,当没有这个属性的时候就push进去,切这个对象也要添加这个下标属性:

var obj = {};
for(var i = 0;i < arr.length;i++){
    if(!obj[arr[i]]){ 
       obj[arr[i]] = true; 
   tempArr.push(arr[i]); 
   }
}
console.log(tempArr);//["a", 8, 10, "d", 20, "f"]

ES6set和from:

console.log(Array.from(new Set(arr)));//["a", 8, 10, "d", 20, "f"]

其实数组去重的方法原理都是利用中间数组去比较,不管用includes还是indexOf,原理都是一样的。还有用其他遍历函数的方法,比如map、filter等,也能实现,但是原理都一样。

(完)

本文分享自微信公众号 - coding个人笔记(gh_2ce38b49dae1),作者:wade

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JavaScript之数组

    Array在JavaScript里面很常用,讲真的,平时开发除了循环数组和push数组之外,对于数组的其他方法和属性几乎都是用到的时候百度。今天自己整理一些数组...

    wade
  • ES6之数组的扩展

    copyWithin方法:改变原数组,接收三个参数,在当前数组内部,将指定位置的成员复制到其他位置(数组函数参数的下标都是包前不包后)

    wade
  • Vue修饰符

    v-modeil不用多说,输入框改变,这个数据就会改变,lazy这个修饰符会在光标离开input框才会更新数据:

    wade
  • Web性能优化系列:10个JavaScript性能提升的技巧

    Nicholas Zakas是一位 JS 大师,Yahoo! 首页的前端主程。他是《高性能 Javascript》的作者,这本书值得每个程序员去阅读。

    哲洛不闹
  • 5.1 一维数组

    C语言入门到精通
  • 【C语言笔记】数组与指针不等价

    数组遍历方式一:使用指针遍历数组元素,p++等价于(p++),即指针指向的地址每次后移一个单位,然后再取地址上的值。这里的一个单位是sizeof(int)个字节...

    正念君
  • Python进阶之NumPy快速入门(三)

    NumPy是Python的一个扩展库,负责数组和矩阵运行。相较于传统Python,NumPy运行效率高,速度快,是利用Python处理数据必不可少的工具。

    HuangWeiAI
  • thinkPHP升级到5.0.13导致update更新出错的问题

    话题还得从tinkPHP群消息说起,双十二那天,群内通知官方发布了5.0.13版本。刚好那几天在折腾redis缓存。官方文档中说5.0.13是一个集合诸多改进的...

    世纪访客
  • Echart图表自适应情况下的打印 原

    报表是全屏自适应的,当点击打印按钮时Echart图表设置成固定的宽度以适应打印的页面,img的src是获取变化后的echart数据流

    tianyawhl
  • JS 控制隐藏显示

    问天丶天问

扫码关注云+社区

领取腾讯云代金券