ES6:有条件地使用传播运营商

时间:2017-08-16 15:44:12

标签: javascript ecmascript-6

我想写一个表达式,它接受query参数的值,并生成一个新对象,其中包含query中的所有内容和默认的$sort值,但仅限于{ {1}}尚未出现。

我觉得我应该使用扩展运算符$sort来执行此操作,但不知道如何在此实例中使用它。

以下代码无效,因为它始终返回... 理想情况下,它应该打印出{$sort: {priority: -1, createdAt: -1}}语句旁边的注释中的内容:

console.log

2 个答案:

答案 0 :(得分: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}}}




答案 1 :(得分:1)

感谢@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}})))