создание класса как Iterable в угловом / машинописном

голоса
1

Я создал класс в угловом, теперь, когда я принести объект через магазин подписку, хотя он возвращает массив объектов, но я не могу использовать цикл ForEach на возвращенном объекте.

Да, я использовал Object.keys (пользователь) .forEach () {..} Это работает, но я хочу сделать то же самое, что делает класс Iterable. Как это.

Образец кода:-

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

Заранее спасибо...

Задан 24/08/2018 в 11:47
источник пользователем
На других языках...                            


3 ответов

голоса
2

Для того , чтобы ваш класс будет итерацией, ваш класс должен иметь метод 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);
}

В этом случае я использовал функцию генератора.

Ответил 24/08/2018 в 12:16
источник пользователем

голоса
1

Вы можете использовать for inоператор:

class User {
  // 
}

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

Кроме того, вы можете проверить , если экземпляр класса имеет propкак свое собственное свойство user.hasOwnProperty(prop)внутри for inцикла. Например, если ваш 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.

Ответил 24/08/2018 в 12:10
источник пользователем

голоса
-1

Что-то вроде этого ?

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));
Ответил 24/08/2018 в 11:59
источник пользователем

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