使用ES6的reduce函数,根据key去重

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

想要实现的效果为:html

原数组:java

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]);spa

写的具体一点,是这样子code

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

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

相关文章
相关标签/搜索