如何在JavaScript中优雅的提取循环内数据详解


Posted in Javascript onMarch 04, 2019

前言

在本文中,我们将介绍两种提取循环内数据的方法:内部迭代和外部迭代。分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧

循环

举个例子,假设有一个函数 logFiles():

const fs = require('fs');
const path = require('path');

function logFiles(dir) {
 for (const fileName of fs.readdirSync(dir)) { // (A)
 const filePath = path.resolve(dir, fileName);
 console.log(filePath);
 const stats = fs.statSync(filePath);
 if (stats.isDirectory()) {
  logFiles(filePath); // (B)
 }
 }
}
logFiles(process.argv[2]);

从 A 行开始的循环用来记录文件路径。它是 for-of 循环和递归的组合(递归调用在 B 行)。

如果你发现循环内的某些数据(迭代文件)有用,但又不想记录它,那应该怎么办?

内部迭代

提取循环内数据的第一个方法是内部迭代:

const fs = require('fs');
const path = require('path');

function logFiles(dir, callback) {
 for (const fileName of fs.readdirSync(dir)) {
 const filePath = path.resolve(dir, fileName);
 callback(filePath); // (A)
 const stats = fs.statSync(filePath);
 if (stats.isDirectory()) {
  logFiles(filePath, callback);
 }
 }
}
logFiles(process.argv[2], p => console.log(p));

这种迭代方式与Array的 .forEach()类似:logFiles() 内实现循环并对每个迭代值(行A)调用 callback。

外部迭代

内部迭代的替代方案是外部迭代:我们实现了一个iterable,可以用生成器帮助我们实现:

const fs = require('fs');
const path = require('path');

function* logFiles(dir) {
 for (const fileName of fs.readdirSync(dir)) {
 const filePath = path.resolve(dir, fileName);
 yield filePath;
 const stats = fs.statSync(filePath);
 if (stats.isDirectory()) {
  yield* logFiles(filePath); // (A)
 }
 }
}
for (const p of logFiles(process.argv[2])) {
 console.log(p);
}

如果是内部迭代,logFiles() 会调用我们(“推”给我们)。而这一次,换我们来调用它了(“拉”过来)。

请注意,在生成器中,必须通过 yield*  进行递归调用(第A行):如果只调用 logFiles() 那么它会返回一个iterable。但我们想要的是在该 iterable 中 yield 每个项目。这就是 yield* 的作用。

生成器有一个非常好的特性,就是处理过程能够与内部迭代一样互锁:每当 logFiles() 创建另一个  filePath  时,我们能够立即查看它,然后 logFiles() 继续。这是一种简单的协作式多任务处理,其中 yield 暂停当前任务并切换到另一个任务。

扩展阅读

Chapter “Iterables and iterators” in “Exploring ES6”.
Chapter “Generators” in “Exploring ES6”.

原文:http://2ality.com/2018/04/extracting-loops.html

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Prototype 工具函数 学习
Jul 23 Javascript
JS的反射问题
Apr 07 Javascript
编写自己的jQuery插件简单实现代码
Apr 19 Javascript
js写的评论分页(还不错)
Dec 23 Javascript
JS实现文字放大效果的方法
Mar 03 Javascript
JS Ajax请求如何防止重复提交
Jun 13 Javascript
Angular实现跨域(搜索框的下拉列表)
Feb 16 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
Mar 13 Javascript
基于JavaScript实现前端数据多条件筛选功能
Aug 19 Javascript
JS实现多物体运动的方法详解
Jan 23 Javascript
vue iview实现动态路由和权限验证功能
Apr 17 Javascript
javascript原型链学习记录之继承实现方式分析
May 01 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
Mar 04 #Javascript
Vuex mutitons和actions初使用详解
Mar 04 #Javascript
JS重学系列之聊聊new操作符
Mar 04 #Javascript
jQuery实现的导航条点击后高亮显示功能示例
Mar 04 #jQuery
ES10 特性的完整指南小结
Mar 04 #Javascript
node.js使用express框架进行文件上传详解
Mar 03 #Javascript
微信小程序新手教程之启动页的重要性
Mar 03 #Javascript
You might like
php中批量修改文件后缀名的函数代码
2011/10/23 PHP
php导入导出excel实例
2013/10/25 PHP
PHP加密解密函数详解
2015/10/28 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
jQuery中的常用事件总结
2009/12/27 Javascript
鼠标滑过出现预览的大图提示效果
2014/02/26 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
js脚本获取webform服务器控件的方法
2014/05/16 Javascript
JQuery插件jcarousellite的参数中文说明
2015/05/11 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
2016/09/12 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
微信小程序 教程之引用
2016/10/18 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
浅谈nodejs中的类定义和继承的套路
2017/07/26 NodeJs
浅析从vue源码看观察者模式
2018/01/29 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
举例讲解Python中is和id的用法
2015/04/03 Python
Python urllib、urllib2、httplib抓取网页代码实例
2015/05/09 Python
以windows service方式运行Python程序的方法
2015/06/03 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
Python安装selenium包详细过程
2019/07/23 Python
如何基于python操作json文件获取内容
2019/12/24 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
Python logging模块handlers用法详解
2020/08/14 Python
HTML5实现移动端复制功能
2018/04/19 HTML / CSS
Manduka官网:瑜伽垫、瑜伽毛巾和服装
2018/07/02 全球购物
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
面试自我介绍演讲稿
2014/04/29 职场文书
工商管理自荐书
2014/07/06 职场文书
励志演讲稿800字
2014/08/21 职场文书
2014镇党委书记党建工作汇报材料
2014/11/02 职场文书
优秀教师主要事迹材料
2015/11/04 职场文书