1. reduce 方法介绍
1.1 简单场景
reduce 函数的设计意图就是方便进行叠加运算:
var arr = [0, 1, 2, 3]; // reduce 实现累加 var total = arr.reduce(function (pre, cur){ return pre + cur; }, 0); console.log(total); // 6
上述代码中,reduce 方法有两个参数,第一个参数是一个 callback,用于进行计算的函数;第二个参数则是累加计算的初始值: 0
reduce 以 0 作为初始值,从数组第 0 项开始累加,上述代码的计算过程如下:
total = 0; // => 0 total = 0 + 0; // => 0 total = 0 + 1; // => 1 total = 1 + 2; // => 3 total = 3 + 3; // => 6
若不设置初始值 0,则 reduce 以数组第 0 项作为初始值,从第 1 项开始累加,其计算过程如下:
total = 0; // => 0 total = 0 + 1; // => 1 total = 1 + 2; // => 3 total = 3 + 3; // => 6
可以看出,reduce 函数根据初始值 0,不断进行叠加,完成最简单的数组累加。
1.2 两种简单的运用场景
第一个 demo,使用 reduce 函数进行二维数组的拼接:
var arr = [ [0], [1, 2], [3, 4, 5] ]; // reduce 实现数组拼接 var result = arr.reduce(function (pre, cur){ return pre.concat(cur); }, []); console.log(result); // [0, 1, 2, 3, 4, 5]
第二个 demo,使用 reduce 函数构造 JSON 数组:
// 此例演示:将所有员工的姓名进行拆分 var staff = ['Bob Dell', 'Johon Jobs', 'Maria July']; // reduce 构造 JSON 数组 var result = staff.reduce(function (arr, full_name){ arr.push({ first_name: full_name.split(' ')[0], last_name: full_name.split(' ')[1] }); return arr; }, []); console.log(JSON.stringify(result)); // [{"first_name":"Bob","last_name":"Dell"},{"first_name":"Johon","last_name":"Jobs"},{"first_name":"Maria","last_name":"July"}]
灵活使用 reduce 函数,能为我们节省不少中间变量和代码。
2. 用于实现 webpack 多文件入口配置
webpack 配置项中entry参数用于配置入口文件路径,通常对于只打包一个目录下的文件,只需要遍历该目录,构造一个如下的对象传递给entry即可:
// 注:index.js 为每个页面的入口文件,所有页面均在 ./fe/pages/ 目录下 var entry = { index: './fe/pages/home/index.js', list: './fe/pages/list/index.js' };
通常,我们使用 reduce 方法来遍历同一目录下的入口:
var fs = require('fs'); var path = require('path'); ... // 定义入口路径 var entryPath = './fe/pages'; // 遍历路径下多文件入口 var entris = fs.readdirSync(entryPath).reduce(function (o, filename) { !/\./.test(filename) && (o[filename] = './' + path.join(entryPath, filename, 'index.js')); return o; }, {}); // entry = { // index: './fe/pages/home/index.js', // list: './fe/pages/list/index.js' // }
对于多页面应用的开发场景,也许会需要构造类似于下面这样的一个对象:
// 多个入口,页面、公共组件并不一定在同一个目录下 var entry = { index: './fe/pages/home/index.js', list: './fe/pages/list/index.js', header: './fe/components/header/index.js', footer: './fe/components/footer/index.js' };
可以发现,我们要打包的页面、公共组件不一定在同一个目录下,这时候就需要对原先的方法进行扩展,见代码:
var fs = require('fs'); var path = require('path'); ... // 定义入口路径 var entryPath = ['./fe/pages', './fe/components']; // 遍历路径下多文件入口 var mkEntriesMap = function (entryPath){ if (typeof(entryPath) == 'string') { // 若 entryPath 为字符串,则直接遍历此目录 var path_map = fs.readdirSync(entryPath).map(function (filename){ return filename + '::./' + path.join(entryPath, filename, 'index.js'); }); } else if (typeof(entryPath) == 'object') { // 若 entryPath 为数组,则进行两级遍历 var path_map = entryPath.map(function (entry){ return fs.readdirSync(entry).map(function (filename){ return filename + '::./' + path.join(entry, filename, 'index.js'); }); }).reduce(function (preArr, curArr){ return preArr.concat(curArr); }, []); } else { throw 'Type of config.entryPath is not valid.'; return; } return path_map.reduce(function (o, file_map){ var file_name = file_map.split('::')[0]; var file_path = file_map.split('::')[1]; if (!/\./.test(file_name)) { o[file_name] = file_path; } return o; }, {}); }; // 构造对象 var entris = mkEntriesMap(entryPath); // entry = { // index: './fe/pages/home/index.js', // list: './fe/pages/list/index.js', // header: './fe/components/header/index.js', // footer: './fe/components/footer/index.js' // }
这样做的好处在于,只需配置一开始的entryPath就行了,同时支持单个或多个路径下的文件打包:
// entryPath 可以为一个字符串 var entryPath = './fe/pages'; // entryPath 也可以设为一个数组 var entryPath = ['./fe/pages', './fe/components'];
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 范文芳1999-真心话电影原声带[HYPE][WAV+CUE]
- 袁培华.1990-我写不出一首情歌给我最爱的你【可登】【WAV+CUE】
- 群星.2007-歌林10年流行岁月12CD【歌林】【WAV+CUE】
- 软硬天师.2006-LONG.TIME.NO.SEE【金牌大风】【WAV+CUE】
- 卓依娜姆《美人谋 网剧影视原声带》[FLAC/分轨][162.27MB]
- 国风大师纯音系列《蒋倩 :古筝演奏家》1CD[MP3][160.7MB]
- 国风大师纯音系列《王中山古筝》1CD[MP3][519MB]
- 徐玮1986-走自己的路[台湾复刻版][WAV+CUE]
- 黄思婷2004-情缘[豪记唱片][WAV+CUE]
- 群星《左耳·听见爱情》星文唱片[WAV+CUE]
- 陈美玲.1987-孤单的心【EMI百代】【WAV+CUE】
- 黄乙玲.2005-甲你作伴【亚律音乐】【WAV+CUE】
- 张雨生.1997-口是心非【丰华】【WAV+CUE】
- 群星《右耳·聆听私语》星文唱片[WAV+CUE]
- VitoCadonau-ramur-encasaveglia(2024)[24-44,1]FLAC