• [译]ES6:数组推导式和生成器推导式


    原文:http://www.2ality.com/2013/01/comprehensions.html


    ES6中将会有两种推导式:数组推导式(array comprehension)和生成器推导式(generator comprehension),你可以使用它们来快速的组装出一个数组或者一个生成器对象.许多编程语言中都有推导式这一语法,比如:CoffeeScript, Python, Haskell, Clojure.

    数组推导式

    下面就是一个ES6中的数组推导式的例子:

    [for (x of a) for (y of b) if (x > y) [x,y]]

    执行该推导式的效果和执行下面这个函数的效果相同(函数中使用了ES6中的for-of循环).

    function arrayComprehension() {
        let result = [];
        for (x of a) {
            for (y of b) {
                if (x > y) {
                    result.push([x,y]);
                }
            }
        }
        return result;
    }

    数组推导式中可以包含下面两种子式:

    • for
    • if

    数组推导式可以很方便的将一个数组转换成另一个数组:

    let numbers = [1,2,3];
    let squares = [for (x of numbers) x*x];

    不过,配合ES6中的箭头函数(arrow function),使用Array.prototype.map来完成这项任务貌似更方便:

    let squares = numbers.map(x => x * x);

    生成器推导式

    生成器推导式看起来和数组推导式很类似,但它是用小括号括住的,且返回的是一个生成器对象,而不是数组.例如:

    (for (x of a) for (y of b) if (x > y) [x,y])

    执行该推导式的效果和执行下面这个生成器函数(也是ES6特性)的效果相同

    function* generatorComprehension() {
        for (x of a) {
            for (y of b) {
                if (x > y) {
                    yield [x,y];
                }
            }
        }
    }

    你可以这样遍历生成器对象中的元素:

    let compr = ( ... );
    for (elem of compr) {
        console.log(elem);
    }

    Firefox已经实现了这两种推导式?

    Firefox虽然早已经实现了这两种推导式,但它实现的语法并不是ES6(而是ES4),如果你愿意,可以简单的了解并尝试一下:

    相关文章

    1. ES6: for-of, 生成器, 迭代器
    2. ES6: 箭头函数和方法定义
  • 相关阅读:
    python搭建开发环境
    django初探
    linux下安装Composer
    文件记录追加 file_put_content
    自定义导出表格
    异步处理接口 fsockopen
    appcache checking update
    js pix
    Event Aggregator
    ko list and css gradient
  • 原文地址:https://www.cnblogs.com/ziyunfei/p/2855018.html
Copyright © 2020-2023  润新知