如果不为空,则查找将变量插入到对象中的速记
我经常有几个命名变量,如果它们不为空或未定义,我希望将它们放入一个对象中。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运算符进行了简化
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))
但就我个人而言,我觉得第二个片段有点难看,可能会选择第一个选项,特别是出于以下三个原因
- 在我看来,它只是看起来更丑
- 资源管理器和Node.js上尚不完全支持
??
运算符 - 很多人甚至不太熟悉运算符,它迫使您甚至不能直接使用它,而是作为一种赋值检查。
相关文章