如果不为空,则查找将变量插入到对象中的速记

我经常有几个命名变量,如果它们不为空或未定义,我希望将它们放入一个对象中。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() == {}

有没有更好的办法?


解决方案

恐怕没有更快捷的方法(从技术上讲,这是一个小方法,然后有点迟钝)

我试着玩弄nullish operator ??,但我不得不说,可行的解决方案似乎比我提出的方案更难看。

本质上,它可以归结为这样一个事实:您正在寻找空运算符(或者也可以是一个空三元)的否定,遗憾的是,这两者都不存在。

这是一个相对紧凑的解决方案,它只是改进了您的解决方案,并使用&&逻辑ANDshort-circuit运算符进行了简化

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
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))

现在,正如我所说的,没有最佳的方法来完成这项工作,因为虽然您可以使用逻辑??进行检查,但它不能同时直接赋给对象属性。我能想到的最好结果是:

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
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. 资源管理器和Node.js上尚不完全支持??运算符
  3. 很多人甚至不太熟悉运算符,它迫使您甚至不能直接使用它,而是作为一种赋值检查。

相关文章