寻找将变量插入对象的简写如果不为null的话

问题描述

通常我有几个命名变量,如果它们不是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() == {}

有更好的方法吗?

解决方法

恐怕并没有真正更短的方法(技术上来说是次要的,然后是更钝的)

我尝试使用nullish operator ??,但是我不得不说,有效的解决方案似乎比我提议的方案难看。

本质上可以归结为以下事实:您正在寻找无效运算符(或无效的三元运算符)的取反,但遗憾的是,这两个都不存在()。

这是一个相对紧凑的解决方案,它只是对您的解决方案进行了改进,并通过使用&&逻辑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. 很多人甚至都不熟悉操作员,这迫使您甚至不能直接使用它,而只是做作业检查。
,

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

它将简单地忽略空值或散布对象