2017-08-29 11 views
3

私はこれを少しでも頭の中で回転させていますが、私はこれを好きなようにすることはできません。実際には、ここで必要なのは、オプションの引数のネストされたデフォルト値を持つことだけです。私が見てみたいと思い 出力は次のようになります。ネストされたデフォルト値を破棄して設定する

代わり
55, 44, { sub1: '0', sub2: 55, sub3: 'all'} 

、私はこの取得:

55, 44, { sub2: 55 } 

誰かがこの1に私の頭をあきらめてもらえますか?

function foo({ param1=55, param2=44, param3:param3 = { sub1:sub1='0', sub2:sub2=200, sub3:sub3='all' } } = { }) { 
    console.log(param1, param2, param3); 
} 

foo({ 
    param3: { 
    sub2: 55 
    } 
}); 
+2

いないものは、そのパラメータに渡されていない場合にのみ適用されますデフォルト値はありますか?私はそれが 'Object.assign'のようなものを実行しないと確信しています –

+0

' param3'をスキップすれば、デフォルトオブジェクト全体が有効になります。私は正直なところ、このようなネストされたデフォルト値に行くことができるかどうかは分かりません。 – jAndy

答えて

4

あなたはparam3ため{sub2: 55}を渡しているので、デフォルト値{ sub1:sub1='0', sub2:sub2=200, sub3:sub3='all' }評価しません(ない代入ターゲット、ここでリテラルをので、あなたはそれがとにかくない何を考えないだろう)。

あなたはparam3は、常に3つのデフォルトの値を持つ変数から構築3つのプロパティを持つオブジェクトになりたい場合は、明示的にそれを自分で構築する必要があります:パラメータがある場合

function foo({param1=55, param2=44, param3: {sub1='0', sub2=200, sub3='all'} = {}} = {}) { 
    var param3 = {sub1, sub2, sub3}; 
    console.log(param1, param2, param3); 
} 
+0

つまり、ネストされた非構造化引数のデフォルト値を作成する方法はありませんか? – jAndy

+0

@jAndyあなたは何を意味するのか分かりません。引数の破壊を任意にネストすることができ、すべてのレベルにデフォルト値を設定できます。あなたがすることができないのは、引数の変更を破棄したり、デフォルト値からの部分を持つ新しいオブジェクトを作成したりすることです。 – Bergi

+0

この例で 'param3'を渡すと、オブジェクト全体が常に上書きされますか?私が思っている点は、渡されたオブジェクト内にデフォルト値を再び作成できる場合です(基本的には外側と同じ、入れ子になっています)。 しかし、あなたはすでにその質問に対する答えを出しているようです。私はその機能をとにかく持っていたいと思います。 – jAndy

0

デフォルトパラメータのみ割り当てられます空の。私はあなたが関数の本体にObject.assignを使用する必要があると思う:

const defaults = { sub1:sub1='0', sub2:sub2=200, sub3:sub3='all' } 
function foo({ param1=55, param2=44, param3 } = { }) { 
    const myParam3 = Object.assign({}, defaults, param3); 
    console.log(param1, param2, myParam3); 
} 

foo({ 
    param3: { 
    sub2: 55 
    } 
}); 
+0

'param3:param3 = defaults'は必要ありません。' param3'だけで十分です。次に、 'Object.assign'呼び出しの' defaults'をインライン化し、それを最初のオブジェクトリテラルとマージすることもできます。 – Bergi

関連する問題