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 相关文章推荐
jQuery 源码分析笔记(5) jQuery.support
Jun 19 Javascript
javascript ajax 仿百度分页函数
Oct 29 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
Sep 14 Javascript
jquery实现模拟百分比进度条渐变效果代码
Oct 29 Javascript
用js读写cookie的简单方法(推荐)
Aug 08 Javascript
JavaScript第一篇之实现按钮全选、功能
Aug 21 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
Feb 22 Javascript
ES6新特性之解构、参数、模块和记号用法示例
Apr 01 Javascript
JavaScript中严格判断NaN的方法
Feb 16 Javascript
微信小程序block的使用教程
Apr 01 Javascript
微信小程序单选radio及多选checkbox按钮用法示例
Apr 30 Javascript
js实现电灯开关效果
Jan 19 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
php IP及IP段进行访问限制的代码
2008/12/17 PHP
Javascript 布尔型分析
2008/12/22 Javascript
Jquery Select操作方法集合脚本之家特别版
2010/05/17 Javascript
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
Javascript添加监听与删除监听用法详解
2014/12/19 Javascript
javascript 中的 delete及delete运算符
2015/11/15 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
2017/01/22 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
详解AngularJs HTTP响应拦截器实现登陆、权限校验
2017/04/11 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
2018/03/06 Javascript
浅谈微信页面入口文件被缓存解决方案
2018/09/29 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
python批量导出导入MySQL用户的方法
2013/11/15 Python
python3批量删除豆瓣分组下的好友的实现代码
2016/06/07 Python
Python 和 JS 有哪些相同之处
2017/11/23 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
手把手教你pycharm专业版安装破解教程(linux版)
2019/09/26 Python
浅谈python中统计计数的几种方法和Counter详解
2019/11/07 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
2020/03/05 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
资深地理教师自我评价
2013/09/21 职场文书
岗位职责的含义
2013/11/17 职场文书
质量月活动策划方案
2014/03/10 职场文书
医疗纠纷协议书
2014/04/16 职场文书
机械专业应届毕业生自荐书
2014/06/12 职场文书
酒店周年庆活动方案
2014/08/21 职场文书
个人剖析材料范文
2014/09/30 职场文书
企业愿景口号
2015/12/25 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
解决flex布局中子项目尺寸不受flex-shrink限制
2022/05/11 HTML / CSS