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 相关文章推荐
使用javascript实现Iframe自适应高度
Dec 24 Javascript
JavaScript原生对象之String对象的属性和方法详解
Mar 13 Javascript
jQuery带进度条全屏图片轮播特效代码分享
Jun 28 Javascript
JS三级可折叠菜单实现方法
Feb 29 Javascript
JS实现留言板功能
Jun 17 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
Jul 10 Javascript
使用jQuery实现页面定时弹出广告效果
Aug 24 jQuery
详解wepy开发小程序踩过的坑(小结)
May 22 Javascript
JavaScript变量作用域及内存问题实例分析
Jun 10 Javascript
vue+element-ui+axios实现图片上传
Aug 20 Javascript
VUE实现强制渲染,强制更新
Oct 29 Javascript
Vue自定义render统一项目组弹框功能
Jun 07 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中调用ASP.NET的WebService的代码
2011/04/22 PHP
浅谈PHP中foreach/in_array的使用
2015/11/02 PHP
详解Window7 下开发php扩展
2015/12/31 PHP
php中strtotime函数性能分析
2016/11/20 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
js控制滚动条缓慢滚动到顶部实现代码
2013/03/20 Javascript
jquery固定底网站底部菜单效果
2013/08/13 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
jQuery移除元素自动解绑事件实现思路及代码
2014/05/31 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
2015/10/13 Javascript
js实现文字滚动效果
2016/03/03 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
2016/06/22 Javascript
AngularJs ng-route路由详解及实例代码
2016/09/14 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
js实现前端图片上传即时预览功能
2017/08/02 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
基于vue.js快速搭建图书管理平台
2017/10/29 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
JavaScript基于面向对象实现的猜拳游戏
2018/01/03 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
2018/03/12 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
Vue2.x通用编辑组件的封装及应用详解
2019/05/28 Javascript
微信小程序使用npm包的方法步骤
2019/08/13 Javascript
javascript利用键盘控制小方块的移动
2020/04/20 Javascript
vue+canvas实现移动端手写签名
2020/05/21 Javascript
python实现发送邮件及附件功能
2021/03/02 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
Python安装与卸载流程详细步骤(图解)
2020/02/20 Python
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
化工专业自荐书
2014/06/16 职场文书
大学活动总结模板
2014/07/10 职场文书
介绍信格式
2015/01/30 职场文书