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 相关文章推荐
使用简洁的jQuery方法实现隔行换色功能
Jan 02 Javascript
JavaScript 里的类数组对象
Apr 08 Javascript
简介JavaScript中的unshift()方法的使用
Jun 09 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
Oct 08 Javascript
requireJS使用指南
Apr 27 Javascript
javascript中对Date类型的常用操作小结
May 19 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
Dec 23 Javascript
JavaScript判断浏览器和hack滚动条的写法
Jul 23 Javascript
微信小程序 自定义消息提示框
Aug 06 Javascript
AngularJS中控制器函数的定义与使用方法示例
Oct 10 Javascript
一种angular的方法级的缓存注解(装饰器)
Mar 13 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
Nov 12 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产生随机数的两种方法实例代码 输出随机IP
2011/04/08 PHP
简单的php写入数据库类代码分享
2011/07/26 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
2014/11/18 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
2015/09/22 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
9个JavaScript评级/投票插件
2010/01/18 Javascript
判断浏览器的javascript版本的代码
2010/09/03 Javascript
JQuery onload、ready概念介绍及使用方法
2013/04/27 Javascript
jquery之超简单的div显示和隐藏特效demo(分享)
2013/07/09 Javascript
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
FF(火狐)浏览器无法执行window.close()解决方案
2014/11/13 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
2015/03/05 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
2015/08/22 Javascript
jQuery表格插件datatables用法详解
2020/11/23 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
2016/12/03 Javascript
angular实现页面打印局部功能的思考与方法
2018/04/13 Javascript
Python脚本实现网卡流量监控
2015/02/14 Python
python删除指定类型(或非指定)的文件实例详解
2015/07/06 Python
python paramiko模块学习分享
2017/08/23 Python
python中kmeans聚类实现代码
2018/02/23 Python
python爬取网易云音乐评论
2018/11/16 Python
在TensorFlow中实现矩阵维度扩展
2020/05/22 Python
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
Nike加拿大官网:Nike.com (CA)
2019/04/09 全球购物
Nayomi官网:沙特阿拉伯王国睡衣和内衣品牌
2020/12/19 全球购物
J2SDK1.5与J2SDK5.0有什么区别
2012/09/19 面试题
法律专业个人实习自我鉴定
2013/09/23 职场文书
医学类导师推荐信范文
2013/11/19 职场文书
2014年自我评价
2014/01/04 职场文书
文艺晚会主持词
2014/03/24 职场文书
管理人员岗位职责
2015/02/14 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书
mysql知识点整理
2021/04/05 MySQL
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA
利用Apache Common将java对象池化的问题
2022/06/16 Servers
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技