总结Javascript中数组各种去重的方法


Posted in Javascript onOctober 04, 2016

前言

在做javascript开发的时候,经常会遇到数组元素重复的问题,而javascript Array又没有直接提供方法解决此问题,还需要自己去实现。这篇文章总结了Javascript中数组各种去重的方法,下面来一起看看。

方法一 利用对象属性不重复的特性

Array.prototype.distinct = function (){
  var arr = this,
    i,
    obj = {},
    result = [],
    len = arr.length;
  for(i = 0; i< arr.length; i++){
    if(!obj[arr[i]]){  //如果能查找到,证明数组元素重复了
      obj[arr[i]] = 1;
      result.push(arr[i]);
    }
  }
  return result;
};

方法二 双层循环,外层循环元素,内层循环时比较值

Array.prototype.distinct = function(){
  var arr = this,
    result = [],
    i,
    j,
    len = arr.length;
  for(i = 0; i < len; i++){
    for(j = i + 1; j < len; j++){
      if(arr[i] === arr[j]){
        j = ++i;
      }
    }
    result.push(arr[i]);
  }
  return result;
}

方法三 数组递归去重

Array.prototype.distinct = function (){
  var arr = this,
    len = arr.length;
  arr.sort(function(a,b){    //对数组进行排序才能方便比较
    return a - b;
  })
  function loop(index){
    if(index >= 1){
      if(arr[index] === arr[index-1]){
        arr.splice(index,1);
      }
      loop(index - 1);  //递归loop函数进行去重
    }
  }
  loop(len-1);
  return arr;
};

方法四 利用indexOf以及forEach

Array.prototype.distinct = function (){
  var arr = this,
    result = [],
    len = arr.length;
  arr.forEach(function(v, i ,arr){    //这里利用map,filter方法也可以实现
    var bool = arr.indexOf(v,i+1);    //从传入参数的下一个索引值开始寻找是否存在重复
    if(bool === -1){
      result.push(v);
    }
  })
  return result;
};

方法五 利用ES6的set

function dedupe(array){
  return Array.from(new Set(array));
}
dedupe([1,1,2,3]) //[1,2,3]

方法六 拓展运算符(…)内部使用for…of循环

let arr = [3,5,2,2,5,5];
let unique = [...new Set(arr)];  //[3,5,2]

总结

好了,以上就是这篇文章的全部内容了,个人比较喜欢使用方法一,不会对原数组进行修改,希望这篇文章对大家能有所帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
基于jquery的自定义鼠标提示效果 jquery.toolTip
Nov 14 Javascript
解析使用JS 清空File控件的路径值
Jul 08 Javascript
javascript中数组的定义及使用实例
Jan 21 Javascript
JavaScript实现基于十进制的四舍五入实例
Jul 17 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
Jan 28 Javascript
JavaScript 闭包机制详解及实例代码
Oct 10 Javascript
node.js学习之base64编码解码
Oct 21 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
Nov 04 Javascript
浅谈Javascript中的Label语句
Dec 14 Javascript
javascript监听页面刷新和页面关闭事件方法详解
Jan 09 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
Aug 22 Javascript
vue自动化路由的实现代码
Sep 30 Javascript
Javascript中arguments对象的详解与使用方法
Oct 04 #Javascript
js判断浏览器是否支持严格模式的方法
Oct 04 #Javascript
浅谈jquery高级方法描述与应用
Oct 04 #Javascript
vue.js中$watch的用法示例
Oct 04 #Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
Oct 04 #Javascript
用jquery快速解决IE输入框不能输入的问题
Oct 04 #Javascript
JavaScript九九乘法口诀表的简单实现
Oct 04 #Javascript
You might like
yii实现级联下拉菜单的方法
2014/07/31 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
2015/10/09 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
PHP实现基于状态的责任链审批模式详解
2019/05/31 PHP
PHP实现简单的计算器
2020/08/28 PHP
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
2011/06/27 Javascript
使用jQuery插件创建常规模态窗口登陆效果
2013/08/23 Javascript
Js参数值中含有单引号或双引号问题的解决方法
2013/11/06 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
js简单实现Select互换数据的方法
2015/08/17 Javascript
js实现无限级树形导航列表效果代码
2015/09/23 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
2016/05/20 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
python执行get提交的方法
2015/04/29 Python
Python中str.format()详解
2017/03/12 Python
值得收藏的10道python 面试题
2019/04/15 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)
2020/01/06 Python
大数据分析用java还是Python
2020/07/06 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
JPA面试常见问题
2016/11/14 面试题
实习协议书范本
2014/04/22 职场文书
趣味运动会广播稿
2014/09/13 职场文书
初中优秀学生评语
2014/12/29 职场文书
力克胡哲观后感
2015/06/10 职场文书
无故旷工检讨书
2015/08/15 职场文书
总经理聘用协议书
2015/09/21 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
2019暑期安全倡议书!
2019/06/27 职场文书
python 如何在list中找Topk的数值和索引
2021/05/20 Python
Vue实现tab导航栏并支持左右滑动功能
2021/06/28 Vue.js