Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用迭代器JavaScript提取整个数组值(克隆数组副本)_Javascript_Node.js - Fatal编程技术网

使用迭代器JavaScript提取整个数组值(克隆数组副本)

使用迭代器JavaScript提取整个数组值(克隆数组副本),javascript,node.js,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)条 检查值是否存在,但在本例中,它不起作用 实现这一点最聪明的模式是什么?您

我有一个迭代器,它从数组中提取一个值

有一个序列

[0,1,2,3,4]

迭代器
it.next()可以访问它

我想使用迭代器提取序列的整个值

也许,中间代码是

var seq =[];
var i = 0;

 while (some_condition) 
      {          
        seq[i] = it.next();
        i++;
      }
我通常使用

if(!foo)条

检查值是否存在,但在本例中,它不起作用

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

您应该与生成器一起使用:

 for(var x of it)
    seq.push(x)
如果要使用
next
,请检查
done
属性:

while(1) {
    x = it.next()
    if(x.done)
        break
    seq.push(x.value)
}
如果您实现自己的迭代器,我建议您跟上标准并使用,例如:

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

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

function fakeIterator(array){

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

对不起,我不明白你想要什么。也许你可以展示一下迭代器的实现?你能解释一下“在这种情况下,它不工作吗?”“它不工作怎么办?”?会发生什么?你以为会发生什么?您当前正在尝试的
some\u条件是什么?迭代器的行为与JS1.7非常相似,就像我说的:我想使用迭代器
it.next()
,拉/克隆序列
[0,1,2,3,4]
的整个值。这需要使用--harmony标志的节点0.11或更大。谢谢,抱歉,实际上,我是在node.js中实现的,迭代器没有这样的功能。也许我需要为它实现一些东西。我还需要另一个答案……我的意思是,整个迭代器都是我自己实现的。我只是简单地说明了ES7中迭代器的基本概念。@KenOKABE:您仍然可以实现harmony协议(返回
{value:…,done:…}
from
next
@KenOKABE:我添加了一个示例如果可能的话,我真的很抱歉我也愿意接受您的解决方案。我喜欢这个hasNext()方法,并将实现到我的。两种解决方案都有效,但@tg435的解决方案具有与当前ES6草案GenGenerator/iterator规范兼容的优势,这意味着当/如果您决定切换到本机实现时,您可能需要编辑更少的代码。对,实际上,我认为ES6也可以使用此hasNext方法,非常简洁。无论如何,我的项目确实很有效,所以接受了谢谢!我的解决方案在ES6中工作,但它不符合ES6 GenGenerator规范。不过这可能并不重要。无论如何,我很高兴我能提供帮助。:D
var myIterator = fakeIterator([0, 4, 6]);
while(myIterator.hasNext()){
    console.log('presenting: ' + myIterator.next());
}

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