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 相关文章推荐
Javascript 获取链接(url)参数的方法
Feb 15 Javascript
php图像生成函数之间的区别分析
Dec 06 Javascript
JS两种定义方式的区别、内部原理
Nov 21 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
Jun 16 Javascript
html的DOM中Event对象onblur事件用法实例
Jan 21 Javascript
Javascript中3个需要注意的运算符
Apr 02 Javascript
分享9点个人认为比较重要的javascript 编程技巧
Apr 27 Javascript
jQuery插件jPaginate实现无刷新分页
May 04 Javascript
jQuery实现径向动画菜单效果
Jul 17 Javascript
javascript返回顶部的按钮实现方法
Jan 09 Javascript
jquery表单验证实例仿Toast提示效果
Mar 03 Javascript
基于vue实现探探滑动组件功能
May 29 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语法(3)
2006/10/09 PHP
分享一个PHP数据流应用的简单例子
2012/06/01 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
php中如何执行linux命令详解
2018/11/06 PHP
yii2 在控制器中验证请求参数的使用方法
2019/06/19 PHP
JavaScript实际应用:innerHTMl和确认提示的使用
2006/06/22 Javascript
javascript html 静态页面传参数
2009/04/10 Javascript
关于全局变量和局部变量的那些事
2013/01/11 Javascript
JS简单的图片放大缩小的两种方法
2013/11/11 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
2014/09/24 Javascript
Vue2.x中的父组件传递数据至子组件的方法
2017/05/01 Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
2017/05/27 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
如何使用VuePress搭建一个类型element ui文档
2019/02/14 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
layui多iframe页面控制定时器运行的方法
2019/09/05 Javascript
Nodejs + Websocket 指定发送及群聊的实现
2020/01/09 NodeJs
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
Django框架搭建的简易图书信息网站案例
2019/05/25 Python
python保存字典和读取字典的实例代码
2019/07/07 Python
Python实现一个数组除以一个数的例子
2019/07/20 Python
python实现滑雪者小游戏
2020/02/22 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
2020/06/02 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
精油和天然健康美容产品:Art Naturals
2018/01/27 全球购物
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
学校采购员岗位职责
2014/01/02 职场文书
建筑经济管理专业求职信分享
2014/01/06 职场文书
工程师岗位职责规定
2014/02/26 职场文书
党的群众路线教育实践活动个人整改措施
2014/10/27 职场文书
出纳岗位职责
2015/01/31 职场文书
幼儿园六一主持词
2015/06/30 职场文书
instantclient客户端 连接oracle数据库
2022/04/26 Oracle
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android