2017-08-16 20 views
1

queryパラメータの値をとり、$sortが存在しない場合に限り、の値とデフォルト値の$sortのすべてを含む新しいオブジェクトを生成する式を作成したいとします。ES6:スプレッド演算子の条件付き使用

これを行うには普及担当者...を使用する必要がありますが、このインスタンスでどのように使用できるかはわかりません。それは常に理想的にはconsole.log文に次のコメントに何があるかプリントアウトする必要があり{$sort: {priority: -1, createdAt: -1}} を返すよう

以下のコードは動作しません:あなたはこのためObject.assignを使用することができます

'use strict' 
const funcUnderTest = (query) => ({ 
    query: /^sort/.test(query) ? query : {$sort: {priority: -1, createdAt: -1}} 
}) 

console.log(funcUnderTest(null)) // Should be { query: {$sort: {priority: -1, createdAt: -1}}} 
console.log(funcUnderTest(({}))) // Should be { query: {$sort: {priority: -1, createdAt: -1}}} 
console.log(funcUnderTest(({forCandidate: 123}))) // Should be { query: {forCandidate: 123, $sort: {priority: -1, createdAt: -1}}} 
console.log(funcUnderTest(({$sort: {name:1}}))) // Should be { query: {$sort: {name: 1}}} 
console.log(funcUnderTest(({forCandidate: 123, $sort: {name:1}}))) // Should be { forCandidate: 123, query: {$sort: {name: 1}}} 
+4

正規表現は、文字列で動作しますが、それは常に失敗した理由を説明し、おそらくfuncUnderTest関数にオブジェクトを入れているようです。 – jollarvia

+0

普及したオペレータがなぜここで助けてくれると思うのか、私は考えていませんか? – Bergi

+0

'forCandidate'は常にクエリの一部でなければなりません、常に外側にあるか、ソートキーがあるかどうかによって本当に変わるのでしょうか? – Bergi

答えて

4

最終的な出力例は、間違っていると仮定します({ query: {$sort: {name: 1}, forCandidate: 123}})。これは他の予想される出力と矛盾しているためです。

'use strict' 
 
const funcUnderTest = (query) => ({ 
 
    query: Object.assign({$sort: {priority: -1, createdAt: -1}}, query || {}) 
 
}) 
 

 
console.log(funcUnderTest(null)) // Should be { query: {$sort: {priority: -1, createdAt: -1}}} 
 
console.log(funcUnderTest(({}))) // Should be { query: {$sort: {priority: -1, createdAt: -1}}} 
 
console.log(funcUnderTest(({forCandidate: 123}))) // Should be { query: {forCandidate: 123, $sort: {priority: -1, createdAt: -1}}} 
 
console.log(funcUnderTest(({$sort: {name:1}}))) // Should be { query: {$sort: {name: 1}}} 
 
console.log(funcUnderTest(({forCandidate: 123, $sort: {name:1}}))) // Should be { forCandidate: 123, query: {$sort: {name: 1}}}

0

@JLRisheの答えのおかげで、それが後に{}の必要がない非推移的だからObject.assignは、ことを除いて拡散構文を使用するのと同じであることを理解||、ここでは普及構文のバージョンです。

'use strict' 
 

 
const funcUnderTest = (query) => ({ 
 
    query: 
 
    { 
 
     $sort: {priority: -1, createdAt: -1}, 
 
     ...query 
 
    } 
 
}) 
 

 
console.log(funcUnderTest(null)) 
 
console.log(funcUnderTest(({}))) 
 
console.log(funcUnderTest(({forCandidate: 123}))) 
 
console.log(funcUnderTest(({$sort: {name:1}}))) 
 
console.log(funcUnderTest(({forCandidate: 123, $sort: {name:1}})))

+0

'{... {... }、...} '意味がありません。 '{...、...} 'を直接書くだけです。 – Bergi

+0

@Bergiあなたは正しいですし、オブジェクトリテラルからスプレッド演算子を削除しただけでも、オブジェクトリテラルが広がることはありません。 – Euge