2017-08-14 2 views
1

私はオブジェクトがすべて同じで、キーが定義済みの項目から決定されるオブジェクトで配列を塗りようとしています。私は複数のif ... elseでこれを行うことができるのは分かっていますが、これは長い方法で使用されているようで、外部ライブラリを使用しないでもっと凝縮したり、効率的なものを望んでいました。JavaScript(TypeScript/Angular):以前のロジックに基づいてオブジェクトのキー/値を設定する最短/最速メソッド?

現在の方法は、ハードコードされたオブジェクトの配列を埋めるために:

fillArray(arr,n) { 
    while(arr.length < n) { 
    arr.push({ 
     'x': Math.round(Math.random(), 
     'name': 'item' + arr.length + 1 
    }); 
    } 
} 

私があれば使用して達成したいものの例:私のアプリケーションで

fillArray(arr, n, type) { 
    while(arr.length < n) { 
    if (type === 'type1') { 
     arr.push({ 
     'x': Math.round(Math.random(), 
     'name': 'item' + arr.length + 1 
     }); 
    } else if (type === 'type2') { 
     arr.push({ 
     'x': Math.round(Math.random(), 
     'y': Math.round(Math.random(), 
     'name': 'item' + arr.length + 1 
     }); 
    } 
    } 
} 

私は方法のこのタイプを使用しますアイテムがあれば1ダースありますし、同様の方法もあります。私はではありません私のアプリケーションは、オブジェクトキーを動的に追加する必要がありますので、これらの項目の静的な型を適用したいです。

頭の中で完全なアイデアを得ることができないというアイデアは、何らかの形でオブジェクトの配列を事前定義していて、次にfindを使って配列の各項目を型として適用します。

擬コード(未テスト):

myTypes = [{ 
    type: 'type1', keys: ['x', 'name']}, 
    {type: 'type2', keys: ['x', 'y', 'name'] 
}]; 
fillArray(arr,n, type) { 
    let currentType = this.myTypes.find(myTypes => myTypes.type === type).keys 
    while(arr.length < n) { 
    // add for loop to iterate over each key/value here separately 
    } 
} 

なる方法仕事のこのタイプ、効率的で、このアプローチに合理的ですか?動的キーを持つこのタイプの配列母集団の他の標準的なプラクティスはありますか?

+0

私はまだ少し不明ですが、キーを決定しているあらかじめ定義された項目は何ですか?あなたの 'if'文にフラグが立てられた' type'? –

+0

私は、メソッドが引数を受け入れ、その引数に基づいて値を設定するようにします。私は 'if'の例で引数を追加するのを忘れていましたが、更新しました。まだ何かが不明な場合は教えてください。 –

+0

'' {{name:function(loop){return 'item' + '}}のような 'x'、' y'、 'name'などの戻り値のマッピングを作成した場合、抽象化を提供できると思いますループ}}] '。型配列をループして関数を呼び出します。 – Jorg

答えて

2

keysのようなオブジェクトを持つ動的プロパティに移動すると、型の安全性が損なわれます。 TypeScriptは主要言語なので、これは重要な関心事です。また、keysはプロパティ値を制御することを許可していません。

これは、クラスまたはいくつかのファクトリ関数の階層になります

class Type1 { 
    x = ...; 
    name = ...; 
} 

class Type2 extends Type1 { 
    y = ...; 
} 

const typesMap = { type1: Type1, type2: Type2 }; 

fillArray(arr, n, type) { 
    while(arr.length < n) { 
    arr.push(new typesMap[type]) 
    } 
} 

元のコードとの違いは、typeが正しくないか欠落している場合、それはかであってもなくてもよい、正常に動作しないことです望ましい。

関連する問題