以前经常使用for循环、map等,很少使用到reduce这个方法,可经过了解后,其实很简单,也很好用。
比如现在要累加一个由数字构成的数组,首先想到的肯定是来个for循环搞定是吧,代码如下;
let arr = [2, 4, 6];
let sum = 0;
for (let i = 0, len = arr.length; i < len; i++) {
sum += arr[i]
}
console.log('sum---', sum)
那如果用reduce来写的话,能不能节省几行呢,代码如下;
let arr = [2, 4, 6];
let sum = arr.reduce((acc, current) => acc + current, 0)
console.log('sum---', sum)
似乎是简洁了一些;具体用法参见MDN教程;
这里说一下reduce接收的参数,一个是回调函数,一个是初始值,上面的初始值是0;那如果不传初始值的话,这个初始值是什么?MDN的教程里说,如果不传初始值,初始值就是数组的第一项,经过验证确实是。
如果没有传初始值:
上面的第一次累加,acc为2,current为4;
如果有初始值,且初始值为0:
上面的第一次累加,acc为0,current为2;
小程序的云开发里面,需要去数据库里面拿全部的数据,云函数里一次性请求的上线是100条,而要一次性拿到所有数据,就可以用reduce来叠加数组,等全部叠加完成,再返回给客户端,官方也是这么干的;
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
const MAX_LIMIT = 100
exports.main = async (event, context) => {
// 先取出集合记录总数
const countResult = await db.collection('todos').count()
const total = countResult.total
// 计算需分几次取
const batchTimes = Math.ceil(total / 100)
// 承载所有读操作的 promise 的数组
const tasks = []
for (let i = 0; i < batchTimes; i++) {
const promise = db.collection('todos').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
tasks.push(promise)
}
// 等待所有
return (await Promise.all(tasks)).reduce((acc, cur) => {
return {
data: acc.data.concat(cur.data),
errMsg: acc.errMsg,
}
})
}
多一个方法就像多一个武器,武器更多,赢的概率就更大!
完结!