la création en tant que classe Iterable dans angulaire / dactylographiée

voix
1

J'ai créé une classe angulaire, maintenant, quand je vais chercher un objet via un abonnement de magasin, même si elle retourne un tableau d'objet, mais je ne peux pas utiliser la boucle forEach sur l'objet retourné.

Oui, je l' ai utilisé Object.keys (utilisateur) .foreach () {..} Il travaille, mais je veux faire la même chose en faisant classe Iterable. Comment cela.

Exemple de code: -

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() {... }
}

Merci d'avance...

Créé 24/08/2018 à 11:47
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
2

Pour que votre classe soit itératives, a besoin de votre classe pour avoir une méthode de 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);
}

Dans ce cas, j'ai utilisé une fonction de générateur.

Créé 24/08/2018 à 12:16
source utilisateur

voix
1

Vous pouvez utiliser l' for inopérateur:

class User {
  // 
}

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

De plus, vous pouvez vérifier si l'instance de classe a propcomme sa propre propriété à l' user.hasOwnProperty(prop)intérieur de la for inboucle. Par exemple, si votre Userclasse étend une autre classe de base et sans vérifier , hasOwnPropertyvous verrez le constructorainsi:

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);
}

Vous verrez cinq alertes: x, y, a, b, constructor.

Créé 24/08/2018 à 12:10
source utilisateur

voix
-1

Quelque chose comme ça ?

class User {
  constructor(public id: number, public name: string) {}

  iterate(callBack: Function) {
    return Object.keys(this).forEach(key => callBack(this[key]));
  }

}

const user = new User(1, 'Foo Bar');
user.iterate(item => console.log(item));
Créé 24/08/2018 à 11:59
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more