NodeJS总结(三):一种快速生成序列的方法
来源:互联网 发布:醉游网络 编辑:程序博客网 时间:2024/06/10 13:09
习惯了python、R等编程语言自带序列的写法,突然想把这样的行为移植到JS中,在NodeJS中,如果要快速生成一个[0-9]的数组,那么最快捷的写法是:
// 生成[0,1,2,3,4,5,6,7,8,9][...Array[10].keys()]
对于上面的写法,理解分为[]步:
1. Array[10]返回一个10个undefined元素的数组;
2. keys()返回数组元素的迭代器,用于对键名的遍历,对数组而言,也就是索引;
3. …代表扩展运算符,用于将数组转换为参数序列(请理解为apply函数),即0,1,2,3,4,5,6,7,8,9;
4. []代表调用Array()方法,最后当然返回一个10个元素的数组;
所以,上述的写法可改写为:
let array = Array(10), indexs = array.keys(), result = Array(...indexs)// 输出结果console.log(result)
那么我们要取10到20的序列,那么就可以采用类似的方法,如下:
[...Array(21).keys()].slice(11)
显然这样的写法实在太低效了,也太浪费存储空间了,并且无法定制步进,从而灵活性也不强,既然这样,那我们能不能利用类似扩展运算符的语法,用下面的写法定义自己的序列呢?
// 2代表起始数字,20代表结束数字,3代码步进[...range(2, 20, 3)]
这里我们可以充分使用ES 6的iterator特性,定义如下的Range构造函数:
class Range { constructor(start, end, step) { this.start = start this.end = end this.step = step } /** * 定义迭代器函数,是实现迭代器效果的关键 */ [Symbol.iterator] () { let curr = this.start, _this = this return { next () { let result = curr < _this.end ? { value : curr, done : false } : { value : undefined, done : true } curr = curr + _this.step return result } } }}
Symbol.iterator是扩展对象支持迭代模式枚举常量,必须以上述的方式进行引用,以保持对Symbol类型的唯一性。
上面的写法虽然实现了功能,但稍嫌啰嗦,我们可以用yield对其进行改进,如下:
[Symbol.iterator] () { let curr = this.start, _this = this // 必须要添加*号 return function* () { // 必须要使用循环 while(curr < _this.end) { yield curr curr = curr + _this.step } }() // 必须要对此函数进行执行}
最后,我们只需要对其进行简单的包装即可完成所有的任务:
function range(start, end, step) { return new Range(start, end, step)}
现在我们就可以利用自定义序列了,如下:
// 输出[ 5, 10, 15, 20 ][...range(5, 25, 5)]// 输出[ 100, 110, 120, 130, 140, 150, 160, 170, 180, 190 ][...range(100, 200, 10)]
结论
利用内置的Symbol.iterator与yield,我们可以轻易构造出自定义的序列数组。
阅读全文
0 0
- NodeJS总结(三):一种快速生成序列的方法
- NodeJS总结(一):快速调试nodejs的三种工具
- 一种中文文本的快速分词方法(三)
- 一种快速文件传输的方法
- 快速排序的一种方法
- 总结一种快速做一条小行线方法
- 生成序列的方法
- 一种基于有序序列mapjoin的方法
- Linux安装Nodejs的三大方法
- Linux安装Nodejs的三大方法
- 推荐一种快速提高英语口语的方法
- 推荐一种快速提高英语口语的方法
- 实数除法的一种快速实现方法
- 实数求根的一种快速实现方法
- 一种快速治疗咳嗽的方法
- 一种快速治疗鼻塞的方法
- 推荐一种快速提高英语口语的方法
- 一种快速编辑电子电路图形的方法
- 2018届校招Andoid开发工程师总结--准备工作
- python os.system("cd")
- lintcode 骰子求和
- python 06
- 前端那些事
- NodeJS总结(三):一种快速生成序列的方法
- 内存管理那些事儿
- iOS学习笔记-116.多线程15——NSOperationQueue和自定义NSOperation合用实现多线程
- python用类实现队列功能
- L1-020. 帅到没朋友
- requests 库的安装
- [IDEA]习惯用的idea快捷方法
- JS Cookie
- javaSE-Day1-数组