2017-08-16 83 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