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中的函数
Jan 22 Javascript
简单的无缝滚动程序-仅几行代码
May 08 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
Feb 12 Javascript
JavaScript实现星星等级评价功能
Mar 22 Javascript
js 奇葩技巧之隐藏代码
Aug 11 Javascript
Node解决简单重复问题系列之Excel内容的获取
Jan 02 Javascript
webpack分离css单独打包的方法
Jun 12 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
May 10 Javascript
vuex vue简单使用知识点总结
Aug 29 Javascript
js实现GIF图片的分解和合成
Oct 24 Javascript
vue 获取元素额外生成的data-v-xxx操作
Sep 09 Javascript
微信小程序实现点击导航条切换页面
Nov 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汉字转拼音的示例
2014/02/27 PHP
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
Laravel5.4框架中视图共享数据的方法详解
2019/09/05 PHP
javascript中expression的用法整理
2014/05/13 Javascript
jQuery截取指定长度字符串的实现原理及代码
2014/07/01 Javascript
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
node.js实现登录注册页面
2017/04/08 Javascript
vue自动化表单实例分析
2018/05/06 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
对Vue- 动态元素属性及v-bind和v-model的区别详解
2018/08/27 Javascript
小程序实现留言板
2018/11/02 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
Vue结合路由配置递归实现菜单栏功能
2020/06/16 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
Python中关于使用模块的基础知识
2015/05/24 Python
深入解析Python中的lambda表达式的用法
2015/08/28 Python
Python Flask-web表单使用详解
2017/11/18 Python
Python对列表去重的多种方法(四种方法)
2017/12/05 Python
python接口自动化(十六)--参数关联接口后传(详解)
2019/04/16 Python
Python实现数值积分方式
2019/11/20 Python
python实现一个点绕另一个点旋转后的坐标
2019/12/04 Python
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
英国著名的小众美容品牌网站:Alyaka
2017/08/08 全球购物
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
计算机通信工程专业毕业生推荐信
2013/12/24 职场文书
《夏夜多美》教学反思
2014/02/17 职场文书
银行服务感言
2014/03/01 职场文书
如何写辞职书
2015/02/26 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
上学路上观后感
2015/06/16 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书