我经常有几个命名变量,如果它们不为空或未定义,我想将它们放入一个对象中。 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() == {}
有没有更好的办法?
恐怕没有更短的方法可以做到这一点(从技术上来说是一个较小的一个,然后是一个更迟钝的一个)
我尝试玩弄无效运算符?? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_nullish_assignment,但我不得不说,可行的解决方案似乎比我即将提出的方案更丑陋。
本质上,它归结为一个事实,您正在寻找 nullish 运算符的否定(或者 nullish 三元),遗憾的是这两个都不存在(目前).
这是一个相对紧凑的解决方案,它只是改进了您的解决方案并通过使用来简化它&&
逻辑与短路 /questions/tagged/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))
但就我个人而言,我发现第二个片段有点丑陋,可能会选择第一个选项,特别是出于以下三个原因
- 在我看来,它只是看起来更丑
- The
??
Explorer 和 Node.js 尚未完全支持运算符
- 可能很多人都不熟悉该运算符,这迫使您甚至不直接使用它,而是将其用作分配检查。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)