初识 generator

题目来源:ScriptOJ

数组拍平(二)

编写一个 JavaScript generator 函数,接受一个仅包含数字的多维数组,返回一个迭代器,可以遍历得到它拍平以后的结果。例如:

const numbers = flatten2([1, [[2], 3, 4], 5])
numbers.next().value // => 1
numbers.next().value // => 2
numbers.next().value // => 3
numbers.next().value // => 4
numbers.next().value // => 5

此时还不知道 ES6 的 Generator,以为是自己写一个,于是有了

function flatten2 (arr) {
    var results = [],
        cursor = 0;

    entryArray(arr);

    // 递归遍历数组
    function entryArray(arr){
        if( typeof arr == "number" ){
            results.push(arr);
        }else{
            for( index in arr ){
                entryArray( arr[index] );
            }
        }
    }

    return {
        next: function(){
            return {
                value: results[ cursor++ % results.length ]
            };
        }
    };
}

提交之后总提示:你的结果有多余的迭代内容
看了一下他人的答案,发现都有一个关键字 yield
原来是使用 ES6 中的 Generator 函数,于是又有了

function *flatten2(arr){
    entryArray(arr);

    function entryArray(arr){
        if( typeof arr == "number" ){
            yield arr;
        }else{
            for( index in arr ){
                entryArray( arr[index] );
            }
        }
    }
}

这次就更尴尬了,报的 Compile Error
原来 yield 不能写在内部函数里,仔细一想也想得通
所以,在下的笨方法就成了

function *flatten2(arr){
    var results = [];
    entryArray(arr);

    function entryArray(arr){
        if( typeof arr == "number" ){
            results.push( arr );
        }else{
            for( index in arr ){
                entryArray( arr[index] );
            }
        }
    }
    for( index in results ){
        yield results[index];
    }
}

来自 ScriptOJ 中陈小俊的回答超短的解法

function *flatten2(arr){
    arr = arr.length ? arr.toString().split(",").map(x => Number.parseInt(x)) : [];
    for( index in arr ){
        yield arr[index];
    }
}

很好的使用了 Array.toString() 再 split() 复原,然后 map() 为 number ,最后 yield 产出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值