JavaScript reduce方法使用方法介绍

目录
  • 1. reduce方法的使用
  • 2. reduce数组的使用场景
    • 2.1 扁平化数组
    • 2.2 数组去重
    • 2.3 计算数组最大/最小值
    • 2.4 数组求和
    • 2.5 计算数组中元素的出现次数
  • 3. 操作对象
  • 4. 使用reduce代替.filter().map()
  • 5. 按顺序执行promise
  • 6. 使用compose函数组合实现管道

1. reduce方法的使用

Array.prototype.reduce(callBack(previousValue, currentValue, currentIndex), initialValue)

reduce是数组的一个高阶方法,用来实现对数组的累加计算

var arr = ['a', 'b', 'c'];
var str = arr.reduce(function (previousValue, currentValue, currentIndex) {
  return previousValue + currentValue;
  });
console.log(str); //abc
var str = arr.reduce(function (previousValue, currentValue, currentIndex) {
  return previousValue + currentValue;
}, 's');
console.log(str); //sabc

reduce的回调函数中一共有4个参数:

  • previous 表示计算的前一个值
  • currentValue 是正在被计算的值
  • currentIndex 是正在计算的索引
  • initialValue 设置累加的初始值

在数组遍历的时候,回调函数的返回值会累加给previousValue,一直到数组遍历完毕返回这个累加值。

在没有传递initialValue的情况下,首次累加的时候previousValue为数组的第1项,currentValue为数组的第2项,当传递了initialValue的时候previousValue初始值为initialValue,currentValue初始值为数组的第一项

2. reduce数组的使用场景

2.1 扁平化数组

使用reduce实现Array.prototype.flat的功能

const arr = [[1, 2, 3], [4, 5, 6, 7, 8], [9]];
const flat = arr.reduce((previousValue, currentValue) => {
   return previousValue.concat(currentValue);
});
console.log(flat); //[1, 2, 3, 4, 5, 6, 7, 8, 9]

2.2 数组去重

const arr = [1, 2, 5, 2, 5, 5];
const deduplication = arr.reduce((previousValue, currentValue) => {
  return previousValue.includes(currentValue) ? previousValue : previousValue.concat([currentValue]);
}, []);
console.log(deduplication);

2.3 计算数组最大/最小值

const arr = [2, 5, 1, 88, 12, -21, 33, 10, 75];
const maxVal = arr.reduce((previousValue, currentValue) => Math.max(previousValue, currentValue));
console.log(maxVal); //8

2.4 数组求和

const arr = [1, 2, 3, 4, 5];
const sum = arr.reduce((previousValue, currentValue) => previousValue + currentValue);
console.log(sum); //15

2.5 计算数组中元素的出现次数

const arr = ['a', 'c', 'b', 'a', 'c', 'e'];
const countedCharacter = arr.reduce((previousValue, currentValue) => {
if (currentValue in previousValue) {
  return { ...previousValue, [currentValue]: previousValue[currentValue] + 1 };
} else {
    return { ...previousValue, [currentValue]: 1 };
  };
}, {});
console.log(countedCharacter); //{a: 2, c: 2, b: 1, e: 1};

3. 操作对象

累加对象数组里面的值

const arr = [{ x: 1 }, { x: 2 }, { x: 3 }];
const sum = arr.reduce((previousValue, currentValue) =>
 previousValue + currentValue.x, 0);
console.log(sum); //6

4. 使用reduce代替.filter().map()

使用reduce可以同时完成过滤合映射,不需要遍历两次数组

const arr = [81, 92, 67, 100, 79];
const scoreArr = arr.filter(s => s > 80).map(val => ({ score: val }));
const scoreArr1 = arr.reduce((previousValue, currentValue) => {
  if (currentValue > 80) { return previousValue.concat([{ score: currentValue }]) } else {
    return previousValue;
  }
}, []);
console.log(scoreArr); //[{score: 81}, {score: 92}, {score: 100}]
console.log(scoreArr1); //[{score: 81}, {score: 92}, {score: 100}]

5. 按顺序执行promise

function p1(num) {
  return new Promise((rs, rj) => {
    setTimeout(() => {
      rs(num + 5);
    }, 100);
  });
 };
function p2(num) {
  return new Promise((rs, rj) => {
    setTimeout(() => {
      rs(num * 2);
    }, 300);
  });
 };
function p3(num) {
  return new Promise((rs, rj) => {
    rs(num - 3);
  })
 };
//链式调用
Promise.resolve(10)
  .then(p1)
  .then(p2)
  .then(p3)
  .then(res => console.log(res)) ;  //27
//使用reduce执行promise
var arr = [p1, p2, p3];
var lastPromise = arr.reduce((previousPromise, currentPromise) => previousPromise.then(currentPromise), Promise.resolve(10));
lastPromise.then(res => console.log(res)); //27

6. 使用compose函数组合实现管道

管道(Pipe)是指输入一个值,依次经过管道(有序的函数运算)后输出这个值,是函数编程的核心思想

function add10(num) {
  return num + 10;
};
function multipl2(num) {
  return num * 2;
};
function divide3(num) {
  return num / 3;
};
const compose = (fns) => (initialValue) => fns.reduce((previous, current) => current(previous), initialValue);
const calculate1 = compose([add10, divide3]);
const calculate2 = compose([divide3, add10, multipl2]);
console.log(calculate1(20)); //10
console.log(calculate2(9)); //26

到此这篇关于JavaScript reduce方法使用方法介绍的文章就介绍到这了,更多相关JS reduce内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaScript中reduce()的用法实例

    前言 过去有很长一段时间,我一直很难理解 reduce() 这个方法的具体用法,平时也很少用到它.事实上,如果你能真正了解它的话,其实在很多地方我们都可以用得上,那么今天我们就来简单聊聊JS中 reduce() 的用法. 一.语法 arr.reduce(function(prev,cur,index,arr){ ... }, init); 其中, arr 表示原数组: prev 表示上一次调用回调时的返回值,或者初始值 init; cur 表示当前正在处理的数组元素: index 表示当前正在处

  • JavaScript数组reduce常见实例方法

    目录 前言 一. reduce定义和用法 语法: 二.reduce浏览器支持情况 三.reduce累加 带初始值 不带初始值 四.reduce数组去重 五.reduce求数组项最大值 六.reduce将二维数组转为一维数组 七.reduce对象里的属性求和 八.reduce计算数组中每个元素出现的个数 九.reduce按属性给数组分类 十.reduce实现map 十一.reduce实现forEach 十二.reduce实现filter 十三.reduce实现find 总结 前言 对比map. f

  • JavaScript reduce的基本用法详解

    目录 reduce的基本定义 基本用法 计算数组里面所有值的和! 累加对象数组里的值! 将二维数组转换为一维数组! 计算数组中每个元素出现的次数 用Reduce按属性对object分类 使用扩展运算符和initialValue绑定包含在对象数组中的数组! 数组去重 数组去重2 总结 reduce的基本定义 个人理解: 根据数组reduce的定义来说: 1.从数组第一个元素开始遍历,逐渐遍历到最后一项 2.reduce 接受两个参数,一个回调函数,一个初始值,如果不给Reduce初始值他会默认从第

  • JavaScript 数组方法filter与reduce

    目录 前言 filter reduce 数组求和 筛选首字母是否是含有b字母 结语 前言 在ES6新增的数组方法中,包含了多个遍历方法,其中包含了用于筛选的filter和reduce filter 主要用于筛选数组的filter方法,在使用中,不会改变原数组,同时会将符合筛选条件的元素,放入新的数组进行返回. /*** * @item 数组元素 * @index 遍历数组下标 * @thisArr 当前数组 */ let arr1 = [1, 2, 3, 4, 5]; let newArr1 =

  • JavaScript数组reduce()方法使用实例详解

    目录 前言 1.累加和累积乘法 2.获取一个数组的最大值和最小值 3.计算数组中元素出现的频率 4.多个数组的展平 总结 前言 今天请让我详细介绍一下这个方法,希望对你有帮助. 这是 reduce 的基本用法: var arr = [1, 2, 3]; function reducer(parmar1, parmar2){ } arr.reduce(reducer) reduce是数组原型对象上的一个方法,可以帮助我们操作数组.它将另一个函数作为其参数,可以称为reducer. reducer

  • JavaScript中数组reduce()方法使用详情

    语法: reduce()对数组中的每个元素进行累加,返回一个新的值,可以传入初始值简单的讲就是返回数组中所有元素的和数  不会改变原始组的值  不会对空数组执行回调函数 arr.reduce(function(tmp, value, [index]) { // dosomething... }, [startValue]) // 提供初始值通常更安全 tmp:上一次的累加值,初始值为外部传进去的初始值 startValue,若没传默认是数组第一个值 value:数组元素:若累加值tmp为数组第一

  • JavaScript中array.reduce()数组方法的四种使用实例

    目录 1.累加和累积乘法 2.获取一个数组的最大值和最小值 3.计算数组中元素出现的频率 4.多个数组的展平 总结 Array.prototype.reduce() 是数组中最强大的方法之一,也是 JavaScript 函数式编程中一个吸引人的特性.但不幸的是,我发现很多朋友不习惯使用它 今天请让我详细介绍一下这个方法,希望对你有帮助. 这是 reduce 的基本用法: var arr = [1, 2, 3]; function reducer(parmar1, parmar2){ } arr.

  • JavaScript中Reduce10个常用场景技巧

    目录 累加/累积 求最大/最小值 格式化搜索参数 反序列化搜索参数 拉平嵌套数组 实现 flat 数组去重 数组计数 获取对象多个属性 反转字符串 不知道大家平常用 Reduce 多不多,反正本瓜用的不多.但实际上,Reduce 能做的,比我们能想到的要多得多,本篇带来 10 个Reduce 常用场景和技巧,一定有你不知道~ 冲ヾ(◍°∇°◍)ノ゙ 累加/累积 累加我们可能是最熟悉 Reduce 的一种用法,除此之外,还可以用做累积. // adder const sum = (...nums)

  • JavaScript reduce方法使用方法介绍

    目录 1. reduce方法的使用 2. reduce数组的使用场景 2.1 扁平化数组 2.2 数组去重 2.3 计算数组最大/最小值 2.4 数组求和 2.5 计算数组中元素的出现次数 3. 操作对象 4. 使用reduce代替.filter().map() 5. 按顺序执行promise 6. 使用compose函数组合实现管道 1. reduce方法的使用 Array.prototype.reduce(callBack(previousValue, currentValue, curre

  • Javascript中的call()方法介绍

    在Mozilla的官网中对于call()的介绍是: 复制代码 代码如下: call() 方法在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法. Call() 语法 复制代码 代码如下: fun.call(thisArg[, arg1[, arg2[, ...]]]) Call() 参数 thisArg 复制代码 代码如下: 在fun函数运行时指定的this值.需要注意的是,指定的this值并不一定是该函数执行时真正的this值,如果这个函数处于非严格模式下,则指定为nul

  • JavaScript判断数据类型有几种方法及区别介绍

    有五种数据判断类型方法typeof .instanceof.constructor.Object.prototype.toString.call().jquery.type() 一.typeof方法 typeof是个操作符,可以判断基本数据类型(返回的结果只能是number,string,boolean,null,symbol,function,object) 返回值分以下几种 对于基本类型.除了null值返回object以外,其他均返回正确的结果 对于引用值来说,除了function返回fun

  • Javascript数组的 splice 方法详细介绍

    目录 前言 牛刀小试 删除元素 添加元素 并且替换元素 example1 example2 example3 example4 添加元素 example1 example2 负数索引支持 总结 前言 splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容.此方法会改变原数组. 语法格式: array.splice(start[, deleteCount[, item1[, item2[, ...]]]]) 参数: start 必选 指定修改的开始

  • 徒手实现关于JavaScript的24+数组方法

    目录 一.遍历类 1. forEach 2. map 3. every 4. some 5. filter 6. reduce 7. reduceRight 二.查找类 1. find 2. findIndex 3. indexOf 4. lastIndexOf 5. includes 三.增删改类 1. push 2. pop 3. unshift 4. shift 5. reverse 6. fill 7. concat 8. join 四.静态方法 1. Array.isArray 2.

  • 分享15个JavaScript的重要数组方法

    目录 1.ForEach 2.Map 3.Filter 4.Find 5.FindIndex 6.Reduce 7.Every 8.Some 9. Sort 10.Flat 11. Reverse 12.Include 13.Fill 14.At 15. Concat 前言; 我们会在构建的每个应用程序中使用数组.它有几种方法,其中一些非常令人困惑.我列出了 15 种,我们应该掌握的数组方法,因为它们经常派上用场. 数组方法的重要一点是有些是可变的,有些是不可变的.在决定针对特定问题使用哪种方法

  • JavaScript弹出窗口方法汇总

    本文实例汇总了常用的JavaScript弹出窗口方法,供大家对比参考,希望能对大家有所帮助.详细方法如下: 1.无提示刷新网页: 大家有没有发现,有些网页,刷新的时候,会弹出一个提示窗口,点"确定"才会刷新. 而有的页面不会提示,不弹出提示窗口,直接就刷新了. 如果页面没有form, 则不会弹出提示窗口 如果页面有form表单, a)<form  method="post" ...>     会弹出提示窗口 b)<form  method=&quo

  • javascript实现图片延迟加载方法汇总(三种方法)

    看到一些大型网站,页面如果有很多图片的时候,当你滚动到相应的行时,当前行的图片才即时加载的,这样子的话页面在打开只加可视区域的图片,而其它隐藏的图片则不加载,一定程序上加快了页面加载的速度,对于比较长的页面来说,这个方案是比较好的.原理是这样:页面可见区域以下的图片先不加载,等到用户向下滚动到图片位置时,再进行加载.这样做的好处在哪里?--当页面有好几屏内容时,有可能用户只看前几屏的内容,这样我们就可以只加载用户需要看的图片,减少服务器向用户浏览器发送图片文件所产生的负荷,下面通过三种方法给大家

  • php实现向javascript传递数组的方法

    本文实例讲述了php实现向javascript传递数组的方法.分享给大家供大家参考.具体如下: 这里介绍的PHP进行数组传值给javascript的技巧,此方法适用php5.2以上,php5.2以上自带该类.低于5.2的,请下载json类.json是一种数据传输格式 php代码: $arr=array('1','2','3','4','5'): $str=json_encode($arr); echo "<input type='button' name='insert' value='I

  • JavaScript常用对象的方法和属性小结

    本文将简单介绍JavaScript中一些常用对象的属性和方法,以及几个有用的系统函数. 一.串方法 JavaScript有强大的串处理功能,有了这些串方法,才能编写出丰富多彩的网页.在这一部分里,我们将介绍到如何使用与串对象有关的方法和属性. 1.串对象的length属性 串对象仅有一个属性length,这个属性值表示这个串所包括字符的相对数目.语法为: stringName.length 2.串对象的方法 JavaScript提供了多个串方法以帮助控制显示信息.串方法可以分为几个大类,如属性方

随机推荐