2016-08-19 6 views
1

を受け入れる関数にオブジェクトを渡す次のように私は定義された機能を持っているのparamリスト

postEvent = (data) -> 
throw new Error("category is required for structured events") if not category 
throw new Error("action is required for structured events") if not action 

$window.submit 'type1', data.category, data.action, data.label, data.property, data.value 

カテゴリとアクションが必要ですが、残りはそうではありませんされています。 dataオブジェクトに所定の値が含まれていない場合は、それを渡すべきではありません。

私は不条理数のif文を使用できますが、より良い方法があると思われます。 オブジェクトの値をアンラップして他の関数に渡す方法を探しています。

例。

data = {category: 'cat1', action: 'action1', value: 1.2} 
postEvent(data) 

これはあなたがdestructuringを使用することができ、次の

$window.submit 'type1', 'cat1', 'action1', 1.2 

答えて

0

になる必要があります。

postEvent = ({category, action, value}) -> 
    console.log category, action, value 

postEvent({ category: 'foo', value: 'bar' }) #logs foo, undefined, bar 

その後、あなたはすべての引数を適用するためにcallを使用することができます。

$window.sumbit.call $window, category, action, value 

あなたは検証が必要な場合は、私は別のアプローチをお勧めします:

DATA_ORDERING = ['category', 'action', 'value'] 

postEvent = (data) -> 
    let stuff = Object.keys data 
    .sort (a, b) -> DATA_ORDERING.indexOf(a) - DATA_ORDERING.indexOf(b) 
    .map (k) -> data[k] 

    let valid = stuff.every (item) -> item? #make sure non-null 

    if valid then $window.submit.apply $window, stuff 
1
  1. は、必要なパラメータ

    params = [data.category, data.action] 
    
  2. を収集

    OPTIONAL = ['label', 'property', 'value'] 
    for prop in OPTIONAL 
        params.push(data[prop]) if data.hasOwnProperty(prop) 
    
  3. すべてのオプションパラメータがメソッドを呼び出し収集apply

    $window.submit.apply($window, params) 
    
関連する問題