数组reduce方法以及高级技巧

基本概念:

 reduce()方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终为一个值。

 reduce为数组中的每一个元素依次执行回调函数。不包括数组中被删除或从未赋值的元素,接受两个参数。第一参数是一个回调函数,又接收四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用reduce的数组。第二个参数是作为第一次调用callback的第一个参数即初始参数。

 语法:

  arr.reduce(callback, [initialValue])

    * callback(执行数组中每一个值得函数,包含四个参数)

      previousValue(上一次调用回返回的值,或者是提供的初始值(initialValue))

      currentValue(数组中当前被处理的元素)

      index(当前元素在数组中的索引)

      array(调用reduce的数组)

    * inatialValue(作为第一次调用callback的第一个参数)

简单应用

  

  可以看出,reduce函数根据初始值1,不断地进行叠加,完成最简单的递归

  reduce函数的返回值结果类型和传入的初始值相同,上个实例中初始值为number类型,同理,初始值也可以为object类型

  

进阶应用

   使用reduce方法可以完成多维的数据叠加,如上例中的初始值{sum: 0},这仅仅是一个维度的操作,如果涉及到了多个属性的叠加,如: {sum: 0, totalInEuros: 0, totalInYen: 0}, 则需要相应逻辑进行处理。

  在下面的方法中,采用分而治之的方法,即将reduce函数第一个参数callback封装一个数组,有数组中的每一个函数单独进行叠加并完成reduce操作。所有的一切通过一个manager函数来管理流程和传递初始参数。

  前方高能!!!!!我也是花了半个多小时才看懂研究出来的,已经加上注释了,希望能够帮助你,有兴趣的可以研究下

  

  上面manager函数的实现,他需要reducers对象作为参数,并返回一个callback类型的函数,作为reduce的第一个参数,在该函数内部,则执行多维的叠加工作(Object.key())。通过这种分而治之的思想,可以完成对象的多个属性同时叠加。

  再来举一个例子:某个同学的期末成绩如下表示

  

  如何求该同学的总成绩?

  

  假设同学因为违纪被处罚在总成绩扣10分,只需要将初始值-10即可。

  

  接下来举的这个例子,增加一点难度。假设该同学的总成绩中,各科所占的比重不同,分别为:50%, 30%, 20%,我们应该如何求出最终的权重结果呢?

  

  再来看一个例子, 如何知道一串字符串中每个字母出现的次数

  

  由于可以通过第二个参数设置叠加结果的类型初始值,因此这个时候reduce就不仅仅是做一个加法了, 我们可以灵活运用它来进行各式各样的类型转换为对象,也可以将一种形式的数组转换为另一种形式的数组。可以动手尝试一下。

  koa(node的框架)源码中,有一个only模块,整个模块就一个简单的返回reduce方法操作的对象:

  

  希望以上的内容会对你对reduce有更深层次的了解,谢谢!

原文地址:https://www.cnblogs.com/wuhongye/p/9308029.html

时间: 2024-11-08 23:44:44

数组reduce方法以及高级技巧的相关文章

es 5 数组reduce方法记忆

reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始合并,最终为一个值. 概念:对数组中的所有元素调用指定的回调函数.该回调函数的返回值为累积结果,并且此返回值在下一次调用该回调函数时作为参数提供. 语法: array1.reduce(callbackfn[, initialValue]) 参数: 参数 定义 array1 必需.一个数组对象. callbackfn 必需.一个接受最多四个参数的函数.对于数组中的每个元素,reduce 方法都会调

JS数组reduce()方法详解及高级技巧

1.语法 arr.reduce(callback,[initialValue]) reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 reduce 的数组. callback (执行数组中每个值的函数,包含四个参数) 1.previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue)) 2.currentValue (数组中当前被处理的元素)

JS 数组reduce()方法详解及高级技巧

1.语法 arr.reduce(callback,[initialValue]) reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 reduce 的数组. callback (执行数组中每个值的函数,包含四个参数) 1.previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue)) 2.currentValue (数组中当前被处理的元素)

JS数组reduce()方法

arr.reduce(function(prev,cur,index,arr){...}, init); 或者 arr.reduce(function(prev,cur,index,arr){...},); arr 表示将要原数组: prev 表示上一次调用回调时的返回值,或者初始值 init; cur 表示当前正在处理的数组元素: index 表示当前正在处理的数组元素的索引,若提供 init 值,则索引为0,否则索引为1: init 表示初始值. 常用的参数只有两个:prev 和 cur.

数组-reduce方法

转自: https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/139 实现 convert 方法,把原始 list 转换成树形结构,要求尽可能降低时间复杂度  原文地址:https://www.cnblogs.com/yhquan/p/11024476.html

JavaScript学习笔记:数组reduce()和reduceRight()方法

很多时候需要累加数组项的得到一个值(比如说求和).如果你碰到一个类似的问题,你想到的方法是什么呢?会不会和我一样,想到的就是使用for或while循环,对数组进行迭代,依次将他们的值加起来.比如: var arr = [1,2,3,4,5,6]; Array.prototype.sum = function (){ var sumResult = 0; for (var i = 0; i < this.length; i++) { sumResult += parseInt(this[i]);

数组中方法some,every , reduce简单方法

1.some方法会依次检测数组中每一个元素是否符合给定函数的条件,返回布尔值,不会对空数组处理,不改变原数组.在执行中,有一个满足就返回true,不再继续执行 var aa = [1,32,4,26]; var bb = aa.some(function(item){ return item > 30; }) console.log(bb); // 输出为true 注意问题 some回调函数有三个参数,一个是当前元素(必须),一个是当前元素的索引index(可选),一个是当前元素属于的数组对象.

使用 reduce 实现数组 map 方法

//使用 reduce 实现数组 map 方法 const selfMap2 = function (fn, context){ let arr = Array.prototype.slice.call(this) // 这种实现方法和循环的实现方法有异曲同工之妙,利用reduce contact起数组中每一项 // 不过这种有个弊端,会跳过稀疏数组中为空的项 return arr.reduce((pre, cur, index) => { return [...pre, fn.call(con

js数组中reduce方法

reduce() 方法 相当于一个函数累加器,接受一个回调函数的结果,然后将前一次的函数结果再和下一次的数据再次执行此回调函数. reduce(function(previousValue,currentValue,index,array){ return xxx  //需要执行的函数结果, previousValue---------上一次的值- currentValue---------当前值 index------当前值的索引 array-------数组 }): [1,2,3,4,5].