如何使用ECMA6提案中的迭代器?

时间:2014-10-14 15:56:18

标签: javascript iterator ecmascript-6

我正在试图弄清楚如何使用当前ECMA6 draft中定义的迭代器。

迭代器的建议如下:

function makeIterator(array){
    var nextIndex = 0;

    return {
       next: function(){
           return nextIndex < array.length ?
               {value: array[nextIndex++], done: false} :
               {done: true};
       }
    }
}

我觉得我错过了一些东西,因为这意味着你必须以这种方式使用它:

var it = makeIterator(someArray);
var current = it.next();

while (current.done !== true){
    console.log(current.value);
    current = it.next();
}

因为,当然,这样的事情会跳过值:

var it = makeIterator(someArray);

while (it.next().done !== true){
    console.log(it.next().value);
}

来自Java世界我很困惑为什么他们没有包含hasNext函数。因为这将允许以下用法:

function makeBetterIterator(array){
    var nextIndex = 0;

    return {
       next: function(){
           return nextIndex < array.length ?
               {value: array[nextIndex++], done: false} :
               {done: true};
       },
       hasNext: function(){
            if(nextIndex < array.length){
                return true;
            }else{
                return false;
            }
       }
    }
}

var someArray = ["one", "two", "three", "four", "five"];

var it = makeBetterIterator(someArray)

while (it.hasNext() === true){
    console.log(it.next().value);
}

是否有更简单的方法来使用迭代器或是它应该如何完成?如果没有更简单的方法,为什么在明显有更好的解决方案的情况下提出这样的迭代器呢?

3 个答案:

答案 0 :(得分:2)

为了避免在while循环之前出现重复,你可以做一些简单的事情:

var it = makeIterator(someArray);

while (true) {
    var current = it.next();
    if (current.done) break;
    console.log(current.value);
}

但实际上,在ES6中,你会这样做:

for (var val of makeIterator(someArray)) {
    console.log(val);
}

ES6迭代器协议很简单,因为Iterator iterface只需要一个方法(next),它返回IteratorResult包含donevalue的{​​{1}} 。一旦协议成为标准,那么实现它的任何东西都将获得支持它的语言级语句的所有好处(如for...of)。

答案 1 :(得分:0)

这与更好的迭代器相同,但更简单:

&#13;
&#13;
    function makeIterator(array){
        var nextIndex = 0;
    
        return {
           next: function(){
               return nextIndex < array.length ?
                   {value: array[nextIndex++], done: false} :
                   false;
           }
        }
    }
    
    var someArray = ["one", "two", "three", "four", "five"];
    
    var it = makeIterator(someArray);
    
    while (current = it.next()){
        $('body').append(current.value+'<br>');
    }
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

var arr = [1,2,3];

var it = arr[Symbol.iterator]();


for (var v, res; (res = it.next()) && !res.done; ) {
    v = res.value;
    console.log( v );
}

好手册http://2ality.com/2015/02/es6-iteration.html