原文:How to Remove Array Duplicates in ES6

翻译:Hytonight云息

有三种方法可以过滤掉一个数组的重复元素并且返回去重后的新数组。我最喜欢使用Set,因为它最精简。

const array = [' ', 1,  2, ' ',' ', 3];
​
// 1: "Set"
[...new Set(array)];
​
// 2: "Filter"
array.filter((item, index) => array.indexOf(item) === index);
​
// 3: "Reduce"
array.reduce((unique, item) => unique.includes(item) ? unique : [...unique, item], []);
​
​
// RESULT:
// [' ', 1, 2, 3];

1. 使用 Set

set是ES6中引入的新的数据类型。set只允许存储不重复的值,所以当你放入一个数组,它会自动去掉重复的值。

OK,我们回去将代码分解开来看,其实就做了两件事情:

  • 首先,我们通过原数组array创建了一个新的set,所有的重复值都被去除了。
  • 然后,我们通过展开运算符转换回了数组
const array = [' ', 1,  2, ' ',' ', 3];
​
// Step 1
const uniqueSet = new Set(array);
// Set { ' ', 1, 2, 3 }
​
// Step 2
const backToArray = [...uniqueSet];
// [' ', 1, 2, 3]

当然,你也可以使用Array.form来将set转回数组

const array = [' ', 1,  2, ' ',' ', 3];
​
Array.from(new Set(array));
​
// [' ', 1, 2, 3]

2.使用 filter()

为了更好地说明这个方法,我们得先说说这两个方法:indexOf()filter()

indexOf

从一个数组中返回给定元素第一次出现的索引

const array = [' ', 1,  2, ' ',' ', 3];
​
array.indexOf(' '); // 0
array.indexOf(1); // 1
array.indexOf(2); // 2
array.indexOf(3); // 5

filter

filter()方法通过给定的条件(一个函数)来返回一个新的数组。换句话说,如果轮到的这个元素进入了条件函数后结果为true,那么它将被加入到过滤后的新数组中,反之则不会加入到结果数组中。

const array = [' ', 1,  2, ' ',' ', 3]
​
array.filter((item, index) => {​console.log(// a. Itemitem,// b. Indexindex,// c. indexOfarray.indexOf(item),// d. Conditionarray.indexOf(item) === index,);
​return array.indexOf(item) === index
});

下面就是执行上述代码后console的输出。可以看到,重复的元素就是那些indexindexOf不同的元素。所以,重复元素返回的结果就是false

(译者按:说的再简单点,就是所有重复元素只取第一次出现的那个,后来出现的丢弃)

那如何得到重复的元素呢?

也是使用filter(),只要将上面的条件反一反就可以啦,如下:

const array = [' ', 1,  2, ' ',' ', 3];
​
array.filter((item, index) => array.indexOf(item) !== index);
​
// [' ',' ']

3. 使用 reduce()

reduce()方法通过提供的reducer 函数来reduce数组中的元素并且将他们合并为一个新的数组。

(译者按:难翻,看MDN解释——reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值)

在这个例子中,我们的reducer函数用来检查最终结果是否已经包含这个item。如果不包含,那么将它放入最终结果,如果已经包含,则丢弃(或者说跳过)这个item

reduce常常会难以理解,所以我们一步步来看。

const array = [' ', 1,  2, ' ',' ', 3];
​
array.reduce((unique, item) => {console.log(// a. Itemitem,// b. Final Array (Accumulator)unique,// c. Condition (Remember it only get pushed if this returns `false`)unique.includes(item),// d. Reducer Function Resultunique.includes(item) ? unique : [...unique, item],);return unique.includes(item) ? unique : [...unique, item]
}, []); //   The initial value of our Accumulator is an empty array
​
// RESULT:
// [' ', 1, 2, 3];

console输出如下:

es6 filter方法_[ 翻译 ] ES6中数组去重的三种方法相关推荐

  1. indexof方法_[ 翻译 ] ES6中数组去重的三种方法

    原文:How to Remove Array Duplicates in ES6 翻译:Hytonight云息 有三种方法可以过滤掉一个数组的重复元素并且返回去重后的新数组.我最喜欢使用Set,因为它 ...

  2. excel添加列下拉框票价_在Excel中制作下拉列表的三种方法

    下拉列表在Excel中的用途十分广泛.在Excel中制作下拉列表可以通过数据有效性.使用窗体控件和VBA控件工具箱中的组合框来制作.下面用一个具体的例子来进行说明(在文章结尾处可下载xls格式的示例文 ...

  3. es6数组去重的三种方法

    1.es6的三种方法 let arr = [2, 5, 3, 3, 5, 7, 3, 7, 3, 7, 2, 2]// (1)拓展运算符 + new Set 方法let narr1 = [...new ...

  4. Js中数组去重的几种方法

    前几天在看前端面试题的时候,其中js部分有个问题是实现数组去重的算法,一开始就想了一两种方法,后来仔细回忆了下这个题,觉得该问题实现方法确实不止局限于一两种方法 ,从不同的角度去看待该问题就会有多种实 ...

  5. JavaScript中数组去重的几种方法整理

    本人菜鸡,前两天去面试,发现再次碰到数组去重这道面试题,比较常见.能够达到去重效果的方法有好几个,感觉有必要整理一下其中几种常见实现: 1,思路:创建一个空数组,然后循环需要去重的数组,对比创建的数组 ...

  6. 5种css隐藏元素的方法_在CSS中隐藏元素的10种方法

    5种css隐藏元素的方法 There are multiple ways to hide an element in CSS, but they differ in the way they affe ...

  7. python读csv最快方法_使用Python读写csv文件的三种方法

    Python读写csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 前言 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是 ...

  8. removelogo使用方法_怎么给视频去水印?这三种方法简单又高效

    不管是做新媒体工作,还是从事视频剪辑,都会跟视频打交道,需要下载和用到一些视频,很多时候也会遇到视频上有水印的情况,需要去除水印才能使用,下面就给大家带来三种去除视频水印的方法,下面一起来看吧. 1. ...

  9. python numpy array转置_详解Numpy数组转置的三种方法T、transpose、swapaxes

    Numpy是高性能科学计算和数据分析的基础包,里面包含了许多对数组进行快速运算的标准数学函数,掌握这些方法,能摆脱数据处理时的循环. 1.首先数组转置(T) 创建二维数组data如下: 进行矩阵运算时 ...

  10. 在php中可以使用几种方法定义数组,PHP中数组定义的几种方法

    在php.html" target="_blank">php和其他编程语言中,需要常常使用数组创建,我们在前端开发中,js的数组创建可以由new array创建,下 ...

最新文章

  1. 如何改变anaconda 的 gcc 版本?
  2. 开启未来十年的编码技术之门
  3. python编程入门第九讲,第九讲作业---函数
  4. JavaScript中带示例的String repeat()方法
  5. 深度学习人脸识别核心技术—框架和优化目标
  6. JavaScript中的标识符(附:关键字表)
  7. 用css实现图片翻转
  8. JavaScript JSON.stringify()
  9. 6.S081 Xv6 Lab 4 traps
  10. 台式机Ubuntu20.04系统下安装Tenda U12 无线网卡驱动
  11. 非科班无实习如何入职腾讯?后台开发岗个人校招学习路线分享!
  12. 虚拟机体验NAS私人云(第四篇):虚拟机安装群晖DSM7.01系统(附赠新版DS918+和DS3615xs启动映像)
  13. PB级数据实时分析,ClickHouse到底有多彪悍?
  14. Java中的偏向锁,轻量级锁, 重量级锁解析
  15. 浏览器突然访问不了某个网址或者提示无法访问此网站
  16. 【云原生】云原生在网络安全领域的应用
  17. 虚拟机怎么架设dns服务器,虚拟机centos7 DNS服务器搭建
  18. 爬取豆瓣电影Top250影片信息
  19. 手机网络邻居访问电脑_不是一个局域网手机怎么访问电脑
  20. 利用for循环,计算1+2+3+……+100。等差数列求和

热门文章

  1. java设计模式之组合模式
  2. 软件测试HW3 主路径覆盖测试
  3. Template Method (模板方法模式)
  4. BZOJ4373 : 算术天才⑨与等差数列
  5. 安装Exchange2007邮件系统
  6. 用VS.NET 2005制作安装程序
  7. 微信小程序微商城(十):用户收货地址管理
  8. Javascript异步操作(Promise)
  9. 阿里云云市场:全国快递物流查询-快递查询接口
  10. PHP报错:Cannot use a scalar value as an array