tworzenie klasy jako Iterable kątowego / nagranie

głosy
1

Stworzyłem klasę w kanciasty, teraz kiedy pobrać obiekt w ramach subskrypcji magazynu, choć zwraca tablicę obiektów, ale nie można korzystać z pętli foreach na zwróconego przedmiotu.

Tak, Użyłem Object.keys (użytkownik) .forEach () {..} To działa, ale chcę zrobić to samo poprzez klasy iterable. Jak się do tego.

Przykładowy kod:-

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

Z góry dziękuję...

Utwórz 24/08/2018 o 11:47
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
2

Aby klasa będzie iterable, klasa musi mieć metodę 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);
}

W tym przypadku użyłem funkcji generatora.

Odpowiedział 24/08/2018 o 12:16
źródło użytkownik

głosy
1

Można użyć for inoperatora:

class User {
  // 
}

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

Dodatkowo można sprawdzić, czy instancja klasy ma propjako swoją własność user.hasOwnProperty(prop)wewnątrz for inpętli. Na przykład, jeśli Userklasa rozszerza inną klasę bazową i bez sprawdzania hasOwnPropertymożna zobaczyć constructortakże:

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

Widać pięć alarmów: x, y, a, b, constructor.

Odpowiedział 24/08/2018 o 12:10
źródło użytkownik

głosy
-1

Coś takiego ?

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));
Odpowiedział 24/08/2018 o 11:59
źródło użytkownik

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