JS实现的数组去除重复数据算法小结


Posted in Javascript onNovember 17, 2017

本文实例讲述了JS实现的数组去除重复数据算法。分享给大家供大家参考,具体如下:

在JS中经常会遇到去除数组中重复数据的需求,在此介绍四种算法以实现JS数组去重的功能.

1. 速度最快算法:对象键值对法

实现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。

//注意点: 判断 是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为一样;例如: a[1]、a["1"] 。解决上述问题还是得调用“indexOf”。
//速度最快, 占空间最多(空间换时间)
function unique(array){
  var n = {}, r = [], len = array.length, val, type;
  for (var i = 0; i < array.length; i++) {
    val = array[i];
    type = typeof val;
    if (!n[val]) {
      n[val] = [type];
      r.push(val);
    } else if (n[val].indexOf(type) < 0) {
      n[val].push(type);
      r.push(val);
    }
  }
  return r;
}
//测试代码:
var arr=[1,2,3,4,5,29,5,3,1,2];
var rel=unique(arr);
console.log(rel);

运行结果:

JS实现的数组去除重复数据算法小结

2.最巧妙算法:优化遍历数组法

实现思路:获取没重复的最右一值放入新数组。(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)

function unique1(array){
  var r = [];
  for(var i = 0, l = array.length; i<l; i++){
    for(var j = i + 1; j < l; j++)
      if(array[i] == array[j]) j == ++i;
    r.push(array[i]);
  }
  return r;
}
//测试代码:
var arr=[1,2,3,4,5,29,5,2];
var rel=unique1(arr);
console.log(rel);

运行结果:

JS实现的数组去除重复数据算法小结

3.算法:排序后相邻去除法

实现思路:给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前一值重复的值。

//将相同的值相邻,然后遍历去除重复值
function unique2(array){
  array.sort();
  var re=[array[0]];
  for(var i = 1; i < array.length; i++){
    if( array[i] !== re[re.length-1])
    {
      re.push(array[i]);
    }
  }
  return re;
}
//测试代码:
var arr=[1,2,3,4,5,29,5,2,3,1];
var rel=unique2(arr);
console.log(rel);

运行结果:

JS实现的数组去除重复数据算法小结

4.算法:数组下标判断法

实现思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组

function unique3(array){
  var n = [array[0]]; //结果数组
  //从第二项开始遍历
  for(var i = 1; i < array.length; i++) {
    //如果当前数组的第i项在当前数组中第一次出现的位置不是i,
    //那么表示第i项是重复的,忽略掉。否则存入结果数组
    if (array.indexOf(array[i]) == i) n.push(array[i]);
  }
  return n;
}
//测试代码:
var arr=[1,2,3,4,5,29,3,4,2,5,1];
var rel=unique3(arr);
console.log(rel);

运行结果:

JS实现的数组去除重复数据算法小结

Javascript 相关文章推荐
关于js注册事件的常用方法
Apr 03 Javascript
jQuery获取浏览器中的分辨率实现代码
Apr 23 Javascript
js使用DOM操作实现简单留言板的方法
Apr 10 Javascript
jquery插件jSignature实现手动签名
May 04 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
Dec 08 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
Jun 02 Javascript
Javascript之面向对象--接口
Dec 02 Javascript
微信小程序开发(二)图片上传+服务端接收详解
Jan 11 Javascript
Angular指令之restict匹配模式的详解
Jul 27 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
May 16 Javascript
jquery实现吸顶导航效果
Jan 08 jQuery
js+h5 canvas实现图片验证码
Oct 11 Javascript
bootstrap轮播模板使用方法详解
Nov 17 #Javascript
浅谈Node模块系统及其模式
Nov 17 #Javascript
基于Bootstrap表单验证功能
Nov 17 #Javascript
js 毫秒转天时分秒的实例
Nov 17 #Javascript
Bootstrap table使用方法汇总
Nov 17 #Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
Nov 16 #Javascript
使用3D引擎threeJS实现星空粒子移动效果
Sep 13 #Javascript
You might like
PHP实现根据浏览器跳转不同语言页面代码
2013/08/02 PHP
php中Y2K38的漏洞解决方法实例分析
2014/09/22 PHP
laravel安装zend opcache加速器教程
2015/03/02 PHP
8个PHP数组面试题
2015/06/23 PHP
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
js 面向对象的技术创建高级 Web 应用程序
2010/02/25 Javascript
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
理解javascript中的严格模式
2016/02/01 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
vue移动端项目缓存问题实践记录
2018/10/29 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
2020/07/17 Javascript
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
python根据出生年份简单计算生肖的方法
2015/03/27 Python
Python进行数据科学工作的简单入门教程
2015/04/01 Python
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
pandas groupby 分组取每组的前几行记录方法
2018/04/20 Python
python3.x 将byte转成字符串的方法
2018/07/17 Python
django解决跨域请求的问题详解
2019/01/20 Python
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
Keras模型转成tensorflow的.pb操作
2020/07/06 Python
python如何操作mysql
2020/08/17 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
2021/01/09 Python
CSS伪类与CSS伪元素的区别及由来具体说明
2012/12/07 HTML / CSS
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
GWT都有什么特性
2016/12/02 面试题
小学教师寄语大全
2014/04/03 职场文书
公司委托书范本5篇
2014/09/20 职场文书
优秀大学生自荐信
2015/03/26 职场文书
大队委员竞选稿
2015/11/20 职场文书
2016年春节慰问信息大全
2015/11/30 职场文书
导游词之安徽九华山
2019/09/18 职场文书
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android