JavaScript中数组去重的5种方法


Posted in Javascript onJuly 04, 2020

正常情况下,数据去重的工作一般都是由后端同事来完成的,但是前端也要掌握好处理数据的能力,万一去重的工作交给我们大前端处理,我们也不能怂呀。现在我总结了一些去重的方法,希望对大家有点帮助。

方法一:new Set()实现数组去重

ES6 提供了新的数据结构 Set,它类似于数组,但是成员的值都是唯一的,没有重复的值。 Set 本身是一个构造函数,用来生成 Set 数据结构。Set函数可以接受一个数组,用于初始化。根据 Set的数据特性,我们可以实现数组去重。

let list = [1, 1, 'a', 'a', true, true, false, false, null, '', null, '', undefined, undefined];
let list1 = Array.from(new Set(list)); // [ 1, "a", true, false, null, "", undefined ]
let list2 = [...new Set(list)]; // [ 1, "a", true, false, null, "", undefined ]

方法二:some()+循环去重

some() 方法用于检测数组中的元素是否满足指定条件(函数提供) 。 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。 如果没有满足条件的元素,则返回false。 我们可以定义一个新数组来承接没有重复的数据,遍历原始数组的时候,用新数组来判断数据是否已经出现过。

function distinct(list) {
   let result = [list[0]];// 用于承接没有重复的数据,初始时将原始数组的第一个值赋给它。
   for (let i = 1; i < list.length; i++) {
     // 判断结果数组中是否存在一样的值,若果没有的话则将数据存入结果数组中。
     if (!(result.some(val => list[i] === val))) {
       result.push(list[i]);
     }
   }
   return result;
 }
let arr = [1, 1, 'a', 'a', true, true, false, false, null, '', null, '', undefined, undefined];
distinct(arr); // [ 1, "a", true, false, null, "", undefined ]

方法三:双重for循环去重

双重for循环,第一层循环确保数组中的每一项都能被比较,第二层循环确保被比较项后的每一项都能跟被比较项比较。

function distinct2(list) {
  for (let i = 0; i < list.length; i++) {
    for (let j = i + 1; j < list.length; j++) {
      // 后面数据的若跟前一项数据相同,则重复,需要去除。
      if (list[i] === list[j]) {
        list.splice(j, 1); // 去除后面的相同项
        j--;
      }
    }
  }
  return list;
}
let arr = [1, 1, 'a', 'a', true, true, false, false, null, '', null, '', undefined, undefined];
distinct2(arr); // [ 1, "a", true, false, null, "", undefined ]

方法四:hasOwnProperty()方法去重

hasOwnProperty() 方法用来检测一个属性是否是对象的自有属性,而不是从原型链继承的。如果该属性是自有属性,那么返回 true,否则返回 false。

function unique(arr) {
 var obj = {}; // 用来记录数组中的数据
 return arr.filter(function(item, index, arr){
   // 如果记录对象中存在某个数据,则返回false过滤掉;否则obj进行记录并筛选出来
   return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
 })
}
let arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
unique(arr) // [ 1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, 'a', {}]

方法五:利用filter()+indexOf()方法去重

indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。

function unique(arr) {
 return arr.filter(function(item, index, arr) {
  // 从数组0位开始查,如果当前元素在原始数组中的第一个索引==当前索引值,说明它是第一次出现。
  return arr.indexOf(item, 0) === index;
 });
}
let list = [1, 1, 'a', 'a', true, true, false, false, null, '', null, '', undefined, undefined];
unique(list); // [ 1, "a", true, false, null, "", undefined ]

此外,数组去重还可以利用filter()、includes()等方法实现,但是思路都跟上面几种方法类似,这里就不一一列举了。

以上就是JavaScript中数组去重的5种方法的详细内容,更多关于JavaScript中数组去重的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
js版本A*寻路算法
Dec 22 Javascript
制作高质量的JQuery Plugin 插件的方法
Apr 20 Javascript
分页栏的web标准实现
Nov 01 Javascript
js数组Array sort方法使用深入分析
Feb 21 Javascript
在图片上显示左右箭头类似翻页的代码
Mar 04 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
Sep 26 Javascript
easyui validatebox验证
Apr 29 Javascript
js style.display=block显示布局错乱问题的解决方法
Sep 21 Javascript
javascript闭包功能与用法实例分析
Apr 06 Javascript
angular $watch 一个变量的变化(实例讲解)
Aug 02 Javascript
JS脚本加载后执行相应回调函数的操作方法
Feb 28 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
Feb 21 Javascript
JS制作简易计算器的实例代码
Jul 04 #Javascript
基于原生js实现九宫格算法代码实例
Jul 03 #Javascript
JavaScript DOM常用操作代码汇总
Jul 03 #Javascript
JavaScript缺少insertAfter解决方案
Jul 03 #Javascript
原生javascript如何实现共享onload事件
Jul 03 #Javascript
Vue如何实现监听组件原生事件
Jul 03 #Javascript
如何在node环境实现“get数据解析”代码实例
Jul 03 #Javascript
You might like
Apache 配置详解(最好的APACHE配置教程)
2010/07/04 PHP
php计算十二星座的函数代码
2012/08/21 PHP
PHP中in_array函数使用的问题与解决办法
2016/09/11 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
php中的钩子理解及应用实例分析
2019/08/30 PHP
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
jquery 锁定弹出层实现代码
2010/02/23 Javascript
myEvent.js javascript跨浏览器事件框架
2011/10/24 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
2015/06/29 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
Bootstrap Chart组件使用教程
2016/04/28 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
jQuery实现本地存储
2020/12/22 jQuery
[03:33]TI9战队采访 - Infamous
2019/08/20 DOTA
python中如何使用正则表达式的非贪婪模式示例
2017/10/09 Python
python中for用来遍历range函数的方法
2018/06/08 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
django框架用户权限中的session缓存到redis中的方法
2019/08/06 Python
Omio荷兰:预订火车、巴士和机票
2018/11/04 全球购物
寻找完美的房车租赁:RVShare
2019/02/23 全球购物
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
《泉水》教学反思
2014/04/11 职场文书
献爱心大型公益活动策划方案
2014/09/15 职场文书
批评与自我批评范文
2014/10/15 职场文书
民政局离婚协议书范本
2014/10/20 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
退休教师欢送会致辞
2015/07/31 职场文书
2019大学生预备党员转正思想汇报
2019/06/21 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
MySQL查询日期时间
2022/05/15 MySQL