问题描述
通常我有几个命名变量,如果它们不是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 short-circuit运算符来简化它
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))
但是我个人觉得第二个代码段有点丑陋,可能只选择第一个,尤其是出于以下三个原因
- 我认为它看起来很丑
- Explorer和Node.js尚不完全支持
??
运算符 - 很多人甚至都不熟悉操作员,这迫使您甚至不能直接使用它,而只是做作业检查。
那
return Object.assign({},a,b);
它将简单地忽略空值或散布对象