我正在试图弄清楚如何使用当前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);
}
是否有更简单的方法来使用迭代器或是它应该如何完成?如果没有更简单的方法,为什么在明显有更好的解决方案的情况下提出这样的迭代器呢?
答案 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包含done
和value
的{{1}} 。一旦协议成为标准,那么实现它的任何东西都将获得支持它的语言级语句的所有好处(如for...of
)。
答案 1 :(得分:0)
这与更好的迭代器相同,但更简单:
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;
答案 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 );
}