最近很着迷于ES6的函数,让代码变得更优雅。ES6里的reduce函数,平时用的不是特别多,真正用起来发现还是挺好用的。

想要实现的效果为:

原数组:

let rawArr = [{id:'123'},{id:'456'},{id:'789'},{id:'123'}];

根据id去重后的结果为

let rawArr = [{id:'123'},{id:'456'},{id:'789'}];

reduce函数介绍

在说如何去重之前,先来介绍一下reduce函数:

array.reduce(callback[, initialValue]);

写的具体一点,是这样子

array.reduce(function(total, currentValue, currentIndex, array), initialValue);

reduce方法会遍历数组,并且为数组中的每个元素,执行定义的callback方法,并把结果汇总为单个值返回。

参数定义

callback:为每个元素执行的方法,它有以下四个参数

   total:累计器,也是最终返回的结果

   currentValue:当前遍历的元素

   currentIndex:当前遍历的元素的下标,可选

   array:原始数组,可选

initialValue:初始值

需要注意的是,如果定义了initialValue,那么total的初始值就是initialValue,遍历则从第0项开始。

如果没有定义,则total的初始值,会是第0项元素,遍历则从第1项开始。

利用reduce函数封装去重方法

由于最终希望返回的是一个去重后的数组,所以reduce函数的初始值要设置为空数组[],这样,在遍历到符合条件的元素的时候,才能push进数组里。

我封装了一个util工具方法:入参为原始数组,以及需要根据哪个key值去重,返回结果为最终去重后的数组

function uniqueByKey(arr,key) {
let hash = {};
let result = arr.reduce((total, currentValue) => {
if (!hash[currentValue[key]]) { //如果当前元素的key值没有在hash对象里,则可放入最终结果数组
hash[currentValue[key]]= true; //把当前元素key值添加到hash对象
total.push(currentValue); //把当前元素放入结果数组
}
return total; //返回结果数组
},[]);
return result;
}

最后,奉上MDN的reduce介绍地址,写的非常详细

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

  

使用ES6的reduce函数,根据key去重的更多相关文章

  1. 使用es6新增Set函数快速数组去重

    使用new Set()快速数组去重: let arr = [1, 2, 2, 3, 4, 5, 5, 5, 6] let set = new Set([...arr]) console.log([.. ...

  2. MapReduce的reduce函数里的key用的是同一个引用

    最近写MapReduce程序,出现了这么一个问题,程序代码如下: package demo; import java.io.IOException; import java.util.HashMap; ...

  3. 浅谈 es6 箭头函数, reduce函数介绍

    今天来谈一下箭头函数, es6的新特性 首先我们来看下箭头函数长什么样子, let result = (param1, param2) => param1+param2; 上述代码 按照以前书写 ...

  4. ES6 入门系列 - 函数的扩展

    1函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法. function log(x, y) { y = y || 'World'; console.log( ...

  5. es6中reduce()方法和reduceRight()方法

    es6中reduce()方法从左往右开始 参数:prev:它是上一次调用回调时返回的结果,每次调用的结果都会给prev cur:当前的元素 index:当前的索引 arr:循环的数组 返回值:函数累计 ...

  6. 弄明白python reduce 函数

    作者:Panda Fang 出处:http://www.cnblogs.com/lonkiss/p/understanding-python-reduce-function.html 原创文章,转载请 ...

  7. 数组中的reduce 函数理解

    第一次见到reduce 是在js 的高级程序设计中,它的意思是把一个数组减少为一个数,举的例子是数组中元素的求和.它接受一个函数作为参数,函数又有两个参数,一个是prev, 前一个值,一个是next, ...

  8. filter、map、sorted和reduce函数

    内置函数——filter.map和reduce filter filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter ...

  9. es6中的函数

    ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面. function log(x, y = 'World') { console.log(x, y); } log('Hello') // ...

随机推荐

  1. django核心配置项

    Django的默认配置文件中,包含上百条配置项目,其中很多是我们‘一辈子’都不碰到或者不需要单独配置的,这些项目在需要的时候再去查手册. 强调:配置的默认值不是在settings.py文件中!不要以为 ...

  2. kubernetes 简介:kube-dns 和服务发现

    服务发现 kubernetes 提供了 service 的概念可以通过 VIP 访问 pod 提供的服务,但是在使用的时候还有一个问题:怎么知道某个应用的 VIP?比如我们有两个应用,一个 app,一 ...

  3. webpack 使用

    背景: 简而言之,如果你曾经遇到过以下任何一种情况:载入有问题的依赖项遇到作用域的问题 —— CSS 和 JavaScript 都会有寻找一个让你在 JavaScript 中使用 Node/Bower ...

  4. jS冒泡优化

    <script>    //冒泡优化    将一个数组中的值从小到大排列    var arr=[65,85,12,36,75,46,50];    var sorted=true;   ...

  5. 第 8 章 容器网络 - 054 - 准备 macvlan 环境

    准备 macvlan 环境 macvlan 本身是 linux kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址,即多个 interface,每个 interface 可以配置 ...

  6. (转)C# Stopwatch详解

    C# Stopwatch类 命名空间:System.Diagnostics; namespace System.Diagnostics { // 提供一组方法和属性,可用于准确地测量运行时间. pub ...

  7. Backup and Recovery Types

    Physical(Raw) and Logical Backup: 1.Physical backups consist of raw copies of the directories and fi ...

  8. php oracle数据库clob和nclob字段

    php oracle数据库clob和nclob字段 nclob类型 1.nclob不能使用php的stream_get_contents来获取数据库的资源内容, 2.并且nclob只能使用to_cha ...

  9. 五中常见的PHP设计模式

    策略模式 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个设计模式本身的核心思想就是面向对象编 ...

  10. 维护满足max(+ or -)min<=k的区间

    这是一种经典的单调栈+线段树的维护方法. 从左到右枚举右端点. 线段树维护每一个左端点的max(+ or -)min的值. 每次右端点移动的时候,把a[i]加入单调栈. 每弹栈一次,便在线段树上把对应 ...