使用迭代器JavaScript拉出整个数组值(数组的克隆副本)

时间:2014-06-29 09:49:47

标签: javascript node.js

我有一些从数组中提取值的迭代器。

有一个序列

[0, 1, 2, 3, 4]

可以通过迭代器it.next()

访问

我想使用迭代器来获取序列的整个值。

也许,中途代码是

var seq =[];
var i = 0;

 while (some_condition) 
      {          
        seq[i] = it.next();
        i++;
      }

我通常使用

if (!foo) bar;

检查值是否存在,但在这种情况下,它不起作用。

实现这一目标的最聪明的模式是什么?

2 个答案:

答案 0 :(得分:2)

你应该将for..of用于生成器:

 for(var x of it)
    seq.push(x)

如果您想使用next,请检查done属性:

while(1) {
    x = it.next()
    if(x.done)
        break
    seq.push(x.value)
}

如果您实现自己的迭代器,我建议您遵守标准并使用harmony protocol,例如:

function rangeIter(min, max) {
    var done = false;
    return {
        next: function() {
            if(done)
                throw Error('Generator has already finished');
            var value;
            if(min >= max) {
                done = true;
                value = undefined;
            } else {
                value = min++;
            }
            return {done:done, value:value};
        }
    }
}

此代码的行为就像“真正的”迭代器一样:

it = rangeIter(3, 7)

console.log(it.next())  // { done: false, value: 3 }
console.log(it.next())  // { done: false, value: 4 }
console.log(it.next())  // { done: false, value: 5 }
console.log(it.next())  // { done: false, value: 6 }
console.log(it.next())  // { done: true, value: undefined }
console.log(it.next())  // Error: Generator has already finished

答案 1 :(得分:0)

这是另一个更像java的解决方案,它应该适用于所有版本的javascript:

function fakeIterator(array){

    var i = 0;
    return {
        next: function(){
            i += 1;
            return array[i - 1];
        },
        hasNext: function(){
            return i < array.length;
        }
    };
}

然后这应该有效:

var myIterator = fakeIterator([0, 4, 6]);
while(myIterator.hasNext()){
    console.log('presenting: ' + myIterator.next());
}

//  =>
//      presenting: 0
//      presenting: 4
//      presenting: 6