如果不为空,则寻找 shorthand 将变量插入到对象中
Looking for shorthand to insert a variable into object if not 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() == {}
有没有更好的方法?
怎么样
return Object.assign({}, a, b);
如果对象
,它将简单地忽略空值或传播
恐怕没有真正更短的方法可以做到这一点(从技术上讲是次要的,然后是更迟钝的)
I tried playing around with the nullish operator ??
, but I have to say the working solution seems uglier than what I'm a bout to propose.
Essentially it boils down to the fact, you're looking for the negation of the nullish operator (or alternatively a nullish ternary), neither of which sadly exist (yet).
这是一个相对紧凑的解决方案,它只是改进了您的解决方案并通过使用 &&
逻辑 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
尚未完全支持 ??
运算符
- 很可能没有多少人甚至熟悉该运算符,它迫使您甚至不能直接使用它,而是将其用作赋值检查。
我知道这是一个老问题,但为了将来参考,我一直在寻找一种方法来解决这个问题,以防在创建我的 User
时没有提供 role
。我认为这对于类似这样的场景应该可以正常工作:
const user = await User.create({
email, password, ...(role && { role })
});
通常我有几个命名变量,如果它们不为空或未定义,我想将它们放入一个对象中。 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() == {}
有没有更好的方法?
怎么样
return Object.assign({}, a, b);
如果对象
,它将简单地忽略空值或传播恐怕没有真正更短的方法可以做到这一点(从技术上讲是次要的,然后是更迟钝的)
I tried playing around with the nullish operator
??
, but I have to say the working solution seems uglier than what I'm a bout to propose.Essentially it boils down to the fact, you're looking for the negation of the nullish operator (or alternatively a nullish ternary), neither of which sadly exist (yet).
这是一个相对紧凑的解决方案,它只是改进了您的解决方案并通过使用 &&
逻辑 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 尚未完全支持
- 很可能没有多少人甚至熟悉该运算符,它迫使您甚至不能直接使用它,而是将其用作赋值检查。
??
运算符
我知道这是一个老问题,但为了将来参考,我一直在寻找一种方法来解决这个问题,以防在创建我的 User
时没有提供 role
。我认为这对于类似这样的场景应该可以正常工作:
const user = await User.create({
email, password, ...(role && { role })
});