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的Function详细
Nov 14 Javascript
javawscript 三级菜单的实现原理
Jul 01 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
Jun 03 Javascript
再次谈论Javascript中的this
Jun 23 Javascript
JS原型链怎么理解
Jun 27 Javascript
JS实现HTML表格排序功能
Aug 05 Javascript
值得学习的bootstrap fileinput文件上传工具
Nov 08 Javascript
jQuery弹出层插件popShow(改进版)用法示例
Jan 23 Javascript
vue系列之动态路由详解【原创】
Sep 10 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
Jan 09 jQuery
Babel 入门教程学习笔记
Jun 13 Javascript
微信小程序云开发实现数据添加、查询和分页
May 17 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 年龄计算函数(精确到天)
2012/06/07 PHP
laravel 4安装及入门图文教程
2014/10/29 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
让网页根据不同IE版本显示不同的内容
2009/02/08 Javascript
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
js日期相关函数总结分享
2013/10/15 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
2017/06/17 Javascript
jQuery+ajax实现修改密码验证功能实例详解
2017/07/06 jQuery
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
React Native日期时间选择组件的示例代码
2018/04/27 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
vue favicon设置以及动态修改favicon的方法
2018/12/21 Javascript
浅析vue插槽和作用域插槽的理解
2019/04/22 Javascript
微信小程序使用蓝牙小插件
2019/09/23 Javascript
Vue列表如何实现滚动到指定位置样式改变效果
2020/05/09 Javascript
javascript实现京东登录显示隐藏密码
2020/08/02 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
[03:55]2014DOTA2国际邀请赛 Fnatic经理采访赢DK在情理之中
2014/07/10 DOTA
python获取服务器响应cookie的实例
2018/12/28 Python
在Python中使用Neo4j的方法
2019/03/14 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
Python列表与元组的异同详解
2019/07/02 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
优秀体育委员自荐书
2014/01/31 职场文书
大型车展策划方案
2014/02/01 职场文书
校园公益广告语
2014/03/13 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
2014年创先争优工作总结
2014/12/11 职场文书
2015年学校团委工作总结
2015/05/26 职场文书
《日月潭》教学反思
2016/02/20 职场文书
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers