2017-08-16 23 views
1

我想寫一個表達式,它取query參數的值,並生成一個新對象,其中包含query和默認$sort值中的所有內容,但只有在$sort尚不存在的情況下才會生效。ES6:擴展運算符的條件使用

我覺得我應該使用擴展運算符...來做到這一點,但不知道如何在這種情況下使用它。

下面的代碼不能正常工作,因爲它總是返回{$sort: {priority: -1, createdAt: -1}} 理想情況下,應打印出什麼在旁邊console.log報表註釋:

'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

您可以使用Object.assign這一點。

我打算假設您的最後一個示例輸出是一個錯誤(應該是{ 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