如果不为空,则寻找 shorthand 将变量插入到对象中

Looking for shorthand to insert a variable into object if not null

通常我有几个命名变量,如果它们不为空或未定义,我想将它们放入一个对象中。 JavaScript 有几个用于构建对象的不错的快捷方式,所以我认为这个用例必须有一个。

我经常做这样的事情。但它是如此冗长。

function foo(a, b) {
  return {...(isNotNullish(a) ? {a} : {}), ...(isNotNullish(b) ? {b} : {})};
}
// the result I want is:
// foo(6, 7) == {a: 6, b: 7}
// foo(6) == {a: 6}
// foo() == {}

有没有更好的方法?

怎么样

return Object.assign({}, a, b);

如果对象

,它将简单地忽略空值或传播

恐怕没有真正更短的方法可以做到这一点(从技术上讲是次要的,然后是更迟钝的)

I tried playing around with the nullish operator ??, but I have to say the working solution seems uglier than what I'm a bout to propose.

Essentially it boils down to the fact, you're looking for the negation of the nullish operator (or alternatively a nullish ternary), neither of which sadly exist (yet).

这是一个相对紧凑的解决方案,它只是改进了您的解决方案并通过使用 && 逻辑 AND 运算符

对其进行了简化

const notNullish = (value) =>
  value !== null && typeof value !== 'undefined'

const foo = (a, b) => ({
  ...(notNullish(a) && {a}),
  ...(notNullish(b) && {b}),
 })

console.log('foo(6, 7) =>', foo(6, 2))
console.log('foo(6) =>', foo(6))
console.log('foo() =>', foo())
console.log('foo(0, false) =>', foo(0, false))

现在正如我所说,没有最佳的方法来执行此操作,因为虽然您可以使用逻辑 ?? 来检查,但它不能同时直接分配给对象 属性。我能想到的最好的是:

const notNullish = (key, value) => {
   const nullishCheck = value ?? 'IS_NULLISH'
   return nullishCheck === 'IS_NULLISH'
      ? {}
      : {[key]: value}
}

const foo = (a, b) => ({
   ...notNullish('a', a),
   ...notNullish('b', b)
})

console.log(foo(6, 4))
console.log(foo(6))
console.log(foo())
console.log(foo(0, false))

但我个人觉得第二个片段有点难看,可能会选择第一个选项,尤其是出于以下三个原因

  1. 在我看来,它看起来更丑
  2. Explorer 和 Node.js
  3. 尚未完全支持 ?? 运算符
  4. 很可能没有多少人甚至熟悉该运算符,它迫使您甚至不能直接使用它,而是将其用作赋值检查。

我知道这是一个老问题,但为了将来参考,我一直在寻找一种方法来解决这个问题,以防在创建我的 User 时没有提供 role。我认为这对于类似这样的场景应该可以正常工作:

const user = await User.create({
  email, password, ...(role && { role })
});