ES6:有条件使用传播算子

Eug*_*uge 1 javascript ecmascript-6

我想编写一个表达式,它接受query参数的值并生成一个新对象,该对象包含所有内容query和默认$sort值,但前提$sort是尚未存在。

我觉得我应该使用传播运算符...来执行此操作,但是不知道在这种情况下如何使用它。

下面的代码不起作用,因为它总是返回。{$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}}}
Run Code Online (Sandbox Code Playgroud)

JLR*_*she 5

您可以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}}}
Run Code Online (Sandbox Code Playgroud)