网站搜索

在 Angular/TypeScript 中将类创建为可迭代的


我在 Angular 中创建了一个类,现在当我通过 store 订阅获取一个对象时,虽然它返回的是对象数组,但我无法对返回的对象使用 forEach 循环。

是的,我使用过 Object.keys(user).forEach(){..}。它可以工作,但我想通过让类可迭代的方式做同样的事情。如何做到这一点。

示例代码:-

class user {
    ...
}
ngOnInit(){
    storeSubsc = this.store.select('users').subscribe(user => {
        this.user = user;
    });
}

login(){
    Object.keys(this.user).forEach()... --> working fine
    I want it like
    this.user.forEach() {... }
}

提前谢谢...

答案#1

为了让你的类可迭代,你的类需要有一个 Symbol.iterator 方法:

class User implements Iterable<string> {
    // ...
    constructor(private username: string, private password: string) { }

    *[Symbol.iterator](): Iterator<string> {
        for (let key of Object.keys(this)) {
            yield key;
        }
    }
}

const u = new User('blabla', '1234');
for (let k of u) {
    console.log(k);
}

在这种情况下,我使用了一个生成器函数。

答案#2

您可以使用 for in 操作符:

class User {
  // 
}

const user = new User(/*args*/); 
for (let prop in user) {
  console.log(prop, user[prop]);
}

此外,你可以在 for in 循环中检查类实例是否拥有 prop 作为它自己的属性 user.hasOwnProperty(prop)。例如,如果你的 User 类继承了另一个基类,而不检查 hasOwnProperty,你也会看到 constructor:

class BaseUser {
  constructor(public x, public y) { }
}

class User extends BaseUser {
  constructor(public a, public b, public x, public y) {
    super(x, y);
  }
}

const user = new User('12', 2, 111, 222); 
for (let prop in user) {
  alert(prop);
}

你将看到五个警报:x, y, a, b, constructor。

相关文章