你如何逆转迭代器的流量?

时间:2017-06-08 15:53:48

标签: javascript ecmascript-6 iterator generator

是否可以访问迭代器的先前值,例如:

function* gen () {
   yield* [0,1,2,3]
}

var it = gen();

it.next().value // 0
it.next().value // 1
it.last().value // would be awesome if this was 0

这绝对是一个好奇心问题。我最近一直在玩发电机,并且想知道是否有人以这种方式使用发电机/迭代器?

如果是这样,我很乐意看到你的解决方案。 (不需要遵循上面的语法)-Thanks

3 个答案:

答案 0 :(得分:4)

您可以将生成器包装在一个保存以前产量的函数中:



previous




我将功能名称更改为last以避免混淆(SELECT * FROM Table A LEFT JOIN Table B ON TableA.Column = TableB.Column AND B.SomeValue <> 'ThisValue' 可能意味着&#34;最后一项&#34;)。

答案 1 :(得分:3)

JS迭代器只知道一个方向:前锋。这意味着,如果您希望将自定义迭代器与for循环等一起使用,它将忽略您的自定义属性。但是,您可以创建自己的custom iterator仅供您自己使用:

const obj = {
   values: [0,1,2,3],
   [Symbol.iterator]() {
     const values = this.values;
     const min = 0;
     const max = values.length - 1;

     let index = -1;

     return {
       next() {
        index = Math.min(index + 1, max);
        return { value: values[index], done: index >= max };
       },
       prev() {
        index = Math.max(index - 1, min);
        return { value: values[index], done: index <= min };
       }
     }
   }
}

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

console.log(it.next().value); // 0
console.log(it.next().value); // 1
console.log(it.prev().value); // would be awesome if this was 0
console.log(it.prev().value); // would be awesome if this was 0
console.log(it.prev().value); // would be awesome if this was 0
console.log(it.next().value); // would be awesome if this was 1

答案 2 :(得分:1)

不,这通常不可行。 Iterators只能提升,不能撤销或其他任何内容。

当然,您可以编写自己的迭代器包装器来缓存最后一个值,并以任何您喜欢的方式访问它。

相关问题