2016-12-13 8 views
0

私は今、私はプロパティを持つすべてのタイプを取得したいのですが「isCool」trueに設定され、この活字体は一度だけ

class Types { 
    static type1 = {name: 'car', isCool: true}; 
    static type2 = {name: 'house', isCool: false}; 
    static type3 = {name: 'tree', isCool: true}; 
} 

ようになりますクラスを持って計算され、別の静的メンバを生成します。 現時点では、私が必要とする度にクラスを反復しています。

私は毎回それを再計算したくありません。また、このクラスは複数の場所でインポートする別々のファイルにあり、配列を1回だけ計算したいだけです。 これはどのように行うことができますか?あなたが一度それを計算し、それが再計算されないように保存することができ

+0

代わりにタイプの静的配列を使用できますか?それをフィルタリングすることができます – fafl

+0

はい、私はそれについて考えましたが、静的メンバーを他の静的メンバーから事前計算する方法があるのだろうかと思っていました – Dragos

答えて

1

class Types { 
    private static COOL_NAMES: string[]; 

    static type1 = { name: 'car', isCool: true }; 
    static type2 = { name: 'house', isCool: false }; 
    static type3 = { name: 'tree', isCool: true }; 

    static getCoolNames(): string[] { 
     if (this.COOL_NAMES) { 
      return this.COOL_NAMES; 
     } 

     this.COOL_NAMES = []; 

     Object.keys(this).forEach(name => { 
      if (this[name].isCool) { 
       this.COOL_NAMES.push(name); 
      } 
     }); 

     return this.COOL_NAMES; 
    } 
} 

code in playground

+0

ああ、シングルトンのように、ありがとう! – Dragos

0

をまず第一に、配列に型を格納するために良さそうです別のメンバーではなく、あなたの人生をもっと楽にしてくれるし、より論理的に見えます。
第2に、forEachループで繰り返し処理する必要はありません。filterを使用できます。
最後に、計算を毎回実行するのではなく読み込むことができるように、計算をメンバーに格納することができます。

class Types { 
    static types = [{name: 'car', isCool: true}, 
        {name: 'house', isCool: false}, 
        {name: 'tree', isCool: true}]; 

    public static coolName = this.getCoolNames(); 

    public static getCoolNames() { 
     return this.types.filter((type) => type.isCool); 
    } 
}