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 autocomplete 使用手册
Apr 01 Javascript
Jquery 实现表格颜色交替变化鼠标移过颜色变化实例
Aug 28 Javascript
关于javascript event flow 的一个bug详解
Sep 17 Javascript
jQuery循环滚动新闻列表示例代码
Jun 17 Javascript
js简单工厂模式用法实例
Jun 30 Javascript
js控制div层的叠加简单方法
Oct 15 Javascript
Bootstrap中data-target 到底是什么
Feb 14 Javascript
iconfont的三种使用方式详解
Aug 05 Javascript
JS选取DOM元素常见操作方法实例分析
Dec 10 Javascript
vue移动端城市三级联动组件使用详解
Jul 26 Javascript
JavaScript this使用方法图解
Feb 04 Javascript
如何让vue长列表快速加载
Mar 29 Vue.js
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
拼音码表的生成
2006/10/09 PHP
深入php list()函数的详解
2013/06/05 PHP
php数组中包含中文的排序方法
2014/06/03 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
JQuery拖拽元素改变大小尺寸实现代码
2012/12/10 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
jQuery+JSON实现AJAX二级联动实例分析
2015/12/18 Javascript
js删除局部变量的实现方法
2016/06/25 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
基于滚动条位置判断的简单实例
2017/12/14 Javascript
jquery应用实例分享_实现手风琴特效
2018/02/01 jQuery
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
使用Angular自定义字段校验指令的方法示例
2019/02/01 Javascript
js实现unicode码字符串与utf8字节数据互转详解
2019/03/21 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
JS面向对象实现飞机大战
2020/08/26 Javascript
[54:29]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第二场
2018/04/09 DOTA
Python单例模式实例详解
2017/03/01 Python
详谈python3中用for循环删除列表中元素的坑
2018/04/19 Python
python paramiko利用sftp上传目录到远程的实例
2019/01/03 Python
Python多进程fork()函数详解
2019/02/22 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
2020/03/19 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
python程序实现BTC(比特币)挖矿的完整代码
2021/01/20 Python
遮罩层 + Iframe实现界面自动显示的示例代码
2020/04/26 HTML / CSS
你的自行车健身专家:FaFit24
2016/11/16 全球购物
应届大专生求职信
2014/06/26 职场文书
培训通知
2015/04/17 职场文书
2019教师的学习计划
2019/06/25 职场文书