热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何从ES6类中创建迭代器

如何解决《如何从ES6类中创建迭代器》经验,为你挑选了4个好方法。

我将如何以与JS1.7 SomeClass.prototype.__iterator__ = function() {...}语法相同的方式从ES6类中创建迭代器?

[编辑16:00]

以下作品:

class SomeClass {
    constructor() {
    }

    *[Symbol.iterator]() {
        yield '1';
        yield '2';
    }

    //*generator() {
    //}

}

an_instance = new SomeClass();
for (let v of an_instance) {
    console.log(v);
}

WebStorm标记*[Symbol.iterator]()在asterix后面直接显示"函数名称预期"警告,但是否则会编译并与Traceur一起运行.(注意WebStorm不会生成任何错误*generator().)



1> alexpods..:

您需要指定Symbol.iterator为其SomeClass返回类实例的迭代器的属性.迭代器必须有next()方法,女巫反过来返回对象donevalue字段.简化示例:

function SomeClass() {
  this._data = [1,2,3,4];
}

SomeClass.prototype[Symbol.iterator] = function() {
  var index = 0;
  var data  = this._data;

  return {
    next: function() {
      return { value: data[++index], done: !(index in data) }
    }
  };
};

或者使用ES6类和箭头函数:

class SomeClass {
  constructor() {
    this._data = [1,2,3,4];
  }

  [Symbol.iterator]() {
    var index = -1;
    var data  = this._data;

    return {
      next: () => ({ value: data[++index], done: !(index in data) })
    };
  };
}

用法:

var obj = new SomeClass();
for (var i of obj) { console.log(i) }

在您更新的问题中,您通过生成器函数实现了类迭代.你可以这样做,但你必须明白迭代器可能不是一个生成器.实际上es6中的迭代器是具有特定方法的任何对象next()



2> Andreas Ross..:

定义合适的迭代器方法.例如:

class C {
  constructor() { this.a = [] }
  add(x) { this.a.push(x) }
  [Symbol.iterator]() { return this.a.values() }
}

编辑:示例使用:

let c = new C
c.add(1); c.add(2)
for (let i of c) console.log(i)


这个特殊的例子没有使用发电机.它只是委托给一个数组迭代器.
@timkay您可能无法使用它,因为在大多数实现中,数组[仍然没有.values()方法](/sf/ask/17360801/)。使用`this.a [Symbol.iterator]()`代替

3> Shaheen Ghia..:

这是在ES6中迭代2d矩阵自定义类的示例

class Matrix {
    constructor() {
        this.matrix = [[1, 2, 9],
                       [5, 3, 8],
                       [4, 6, 7]];
    }

    *[Symbol.iterator]() {
        for (let row of this.matrix) {
            for (let cell of row) {
                yield cell;
            }
        }
    }
}

这类课程的用法是

let matrix = new Matrix();

for (let cell of matrix) {
    console.log(cell)
}

哪个会输出

1
2
9
5
3
8
4
6
7


你可以使用`for ... of` loops来简化迭代器:`for(let this of this.matrix){for(let cell of row){yield cell; }

4> ekillaby..:

文档:迭代协议

实现迭代器协议可迭代协议技术的示例类:

class MyCollection {
  constructor(elements) {
    if (!Array.isArray(elements))
      throw new Error('Parameter to constructor must be array');

    this.elements = elements;
  }

  // Implement "iterator protocol"
  *iterator() {
    for (let key in this.elements) {
      var value = this.elements[key];
      yield value;
    }
  }

  // Implement "iterable protocol"
  [Symbol.iterator]() {
    return this.iterator();
  }
}

使用任一技术访问元素:

var myCollection = new MyCollection(['foo', 'bar', 'bah', 'bat']);

// Access elements of the collection using iterable
for (let element of myCollection)
  console.log('element via "iterable": ' + element);

// Access elements of the collection using iterator
var iterator = myCollection.iterator();
while (element = iterator.next().value)
  console.log('element via "iterator": ' + element);


推荐阅读
author-avatar
嘻嘻2502891803
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有