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下通过的XMLHttpRequest发送请求的代码
Jun 28 Javascript
关于jQuery参考实例 1.0 jQuery的哲学
Apr 07 Javascript
JSONP之我见
Mar 24 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
Aug 26 Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
Sep 11 Javascript
seajs加载jquery时提示$ is not a function该怎么解决
Oct 23 Javascript
vue.js通过自定义指令实现数据拉取更新的实现方法
Oct 18 Javascript
详解Sea.js中Module.exports和exports的区别
Feb 12 Javascript
jQuery EasyUI ProgressBar进度条组件
Feb 28 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
Nov 30 Javascript
layui 富文本赋值,取值,取纯文本值的实例
Sep 18 Javascript
VUE+node(express)实现前后端分离
Oct 13 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
PHP7.0版本备注
2015/07/23 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
php数据库操作model类(使用__call方法)
2016/11/16 PHP
laravel 数据验证规则详解
2019/10/23 PHP
javascript 模拟JQuery的Ready方法实现并出现的问题
2009/12/06 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
jquery序列化方法实例分析
2015/06/10 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
javascript常用经典算法实例详解
2015/11/25 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
Vue filter介绍及其使用详解
2017/10/21 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
AngularJs 最新验证手机号码的实例,成功测试通过
2017/11/26 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
基于React Native 0.52实现轮播图效果
2020/08/25 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
2019/04/17 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
解决vue路由name同名,路由重复的问题
2020/08/05 Javascript
vue+element实现动态加载表单
2020/12/13 Vue.js
Python实现把json格式转换成文本或sql文件
2015/07/10 Python
Python编程中归并排序算法的实现步骤详解
2016/05/04 Python
Python中扩展包的安装方法详解
2017/06/14 Python
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
Python登录注册验证功能实现
2018/06/18 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
出纳员的岗位职责
2014/02/22 职场文书
党员对十八届四中全会的期盼思想汇报范文
2014/10/17 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书
五年级作文之成长
2019/09/16 职场文书