我有一些从数组中提取值的迭代器。
有一个序列
[0, 1, 2, 3, 4]
可以通过迭代器it.next()
我想使用迭代器来获取序列的整个值。
也许,中途代码是
var seq =[];
var i = 0;
while (some_condition)
{
seq[i] = it.next();
i++;
}
我通常使用
if (!foo) bar;
检查值是否存在,但在这种情况下,它不起作用。
实现这一目标的最聪明的模式是什么?
答案 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