Array.prototype.reduce()方法介绍:

感性认识reduce累加器:
const arr = [1, 2, 3, 4];
const reducer = (accumulator, currentValue) => accumulator + currentValue;
console.log(arr.reduce(reducer)); //10,即1 + 2 + 3 + 4。
console.log(arr.reduce(reducer, 6));//16,即6 + 1 + 2 + 3 + 4。

你可以通过打印reducer的两个参数,从而直观的感受到,第二个参数currentValue是当前的元素,而第一个参数accumulator总是返回每一次执行reducer函数的返回值,如此一次次累加起来。

reduce方法接收两个参数:

reduce(callback,initialValue)

callback(accumulator,currentValue, index,arr) : 执行于每个数组元素的函数;

initialValue : 传给callback的初始值。

更详细的讲,callback就是由你提供的reducer函数,调用reduce()方法的数组中的每一个元素都将执行你提供的reducer函数,最终汇总为单个返回值

reducer函数(callback)接受4个参数:

1. reduce()实现数组对象去重:

简单的数组去重,我们可以通过把数组转换为ES6提供的新数据结构Set实现。

然而在实际业务上,我们经常需要处理后台返回的json格式的数组对象进行去重。

比如:

const arr = [{
id: 1,
phone: 1880001,
name: 'wang',
},{
id: 2,
phone: 1880002,
name: 'li',
},{
id: 3,
phone: 1880001,
name: 'wang',
}]

我们会需要去掉电话号码重复的元素,这时候就需要使用hash检测方法:

const unique= arr =>{
let hash = {};
return arr.reduce((item, next) => {
hash[next. phone]? '': hash[next.phone] = true && item.push(next);
return item
}, []);
}
unique(arr)
/* [{
id: 1,
phone: 1880001,
name: 'wang',
},{
id: 2,
phone: 1880002,
name: 'li',
}] */

2. reduce()实现数组扁平化:

const flatten= arr => arr.reduce((item, next) => item.concat( Array.isArray(arr)? flatten(next): next, []));
//concat方法的参数接受数组也接受具体的值

js技巧-使用reduce实现更简洁的数组对象去重和数组扁平化的更多相关文章

  1. JS中数组对象去重

    JS数组去重 JS中对数组去重最好不要用unique方法,该方法主要是对dom节点数组的去重,如果对普通的数组元素去重只会去掉与之相邻的重复元素,也就是如果数组中还有不相邻的重复元素存在,将不会被去掉 ...

  2. 【原】js数组对象去重最简单的方法

    简单的数组去重是比较简单的,方法也特别多,如给下面的数组去重: let arr = [1,2,2,4,9,6,7,5,2,3,5,6,5] 最常用的可以用for循环套for循环,再用splice删除重 ...

  3. js 数组对象去重

    let hash = {}; let config = [ { name: 2, state: true, output: 'Y'}, { name: 3, state: true, output: ...

  4. 数组对象去重 reduce()

    let log = console.log.bind(console); let person = [ {id: 0, name: "小明"}, {id: 1, name: &qu ...

  5. js中数组对象去重的方法

    var arr = [{ key: '01', value: '乐乐' }, { key: '02', value: '博博' }, { key: '03', value: '淘淘' },{ key: ...

  6. js遍历数组对象和非数组对象

    //---------for用来遍历数组对象 var i,myArr = ["a","b","c"]; ; i < myArr.len ...

  7. js数组对象去重

    转: https://www.cnblogs.com/gaoht/p/9850449.html 在数组对象中去掉重复的对象: export function deteleObject(obj) { v ...

  8. js数组的操作及数组与字符串的相互转化

    数组与字符串的相互转化 <script type="text/javascript">var obj="new1abcdefg".replace(/ ...

  9. JS中集合对象(Array、Map、Set)及类数组对象的使用与对比

    原文地址 在使用js编程的时候,常常会用到集合对象,集合对象其实是一种泛型,在js中没有明确的规定其内元素的类型,但在强类型语言譬如Java中泛型强制要求指定类型. ES6引入了iterable类型, ...

随机推荐

  1. mongodb创建.bat快捷方式

    1.在mongodb安装目录下找到bin文件下的mongod.exe 复制路径,然后创建startmongodb.bat文件 例如 cd C:\Program Files\MongoDB\Server ...

  2. Spring入门第三课

    属性注入 属性注入就是通过setter方法注入Bean的属性值或依赖的对象. 属性植入使用<property>元素,使用name属性指定Bean的属性名称,value属性或者<val ...

  3. c++中字符串的截取:

    c++中字符串的截取: string 类提供字符串处理函数,利用这些函数,程序员可以在字符串内查找字符,提取连续字符序列(称为子串),以及在字符串中删除和添加.我们将介绍一些主要函数. 1.函数fin ...

  4. js中将字符串转为JSON的三种方式

    1.eval方式解析,恐怕这是最早的解析方式了.如下: function strToJson(str){ var json = eval('(' + str + ')'); return json; ...

  5. Dapper 存储过程、事务等

    接上一篇<Dapper 增删改查> 0.存储过程 create proc p_login ), ), ) output as begin if(exists(select * from U ...

  6. LVM使用

    LVM框架 LVM实验环境准备 创建一个128MB的文件模拟磁盘 [centos@centos lvm]$ dd if=/dev/zero of=./disk.img count=128 bs=1MB ...

  7. 网格概念 Gutter

    Bootstrap4也是由以上基础概念作为发展 Bootstrap 栅栏式排版 , 总栏数为12  (以下代码探寻问题, 实际上使用方法是错误的) <style> .box { heigh ...

  8. webpack@3.6.0(2) -- css及图片相关问题

    本篇内容 css3前缀处理postcss 消除未使用的css部分 图片处理 css分离和分离后的图片处理 css3前缀处理postcss cnpm i -D postcss-loader autopr ...

  9. Xuzhou Winter Camp 1C(模拟)

    #include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include ...

  10. Docker 基本使用

    本文主要通过在 docker 镜像里安装和启动 nginx 来说明 docker 的基本使用. 1.  下载 ubuntu 这个docker 镜像:    docker pull ubuntu 2.  ...