我有一个属性bar
,可以是undefined
或null
const result = {
foo1: 'foo1',
foo2: 'foo2',
foo3: 'foo3',
bar: await some?.http?.request?.that?.can?.be?.undefined?.or?.null
}
// outputs this
const result: {
foo1: 'foo1',
foo2: 'foo2',
foo3: 'foo3',
bar: undefined /// -> How to prevent this from being added
}
我知道我可以做到
const result: {
foo1: 'foo1',
foo2: 'foo2',
foo3: 'foo3',
}
const bar = await some?.http?.request?.that?.can?.be?.null?.or?.undefined
if (bar != null) {
result.bar = bar
}
但是有没有更短的(语法)方式?
此外,如果result
一旦定义为immutable
,这种方法就行不通了
答案 0 :(得分:3)
您可以通过首先计算bar
的值来有条件地添加bar
(就像您在第二个示例中一样):
const bar = await some?.http?.request?.that?.can?.be?.undefined?.or?.null
然后,当您创建result
时,您可以使用三元条件运算符返回包含{bar: <value>}
或空对象{}
的对象,然后可以使用{将它们合并到结果对象中{3}}:
const bar = await some?.http?.request?.that?.can?.be?.undefined?.or?.null
const result = {
foo1: 'foo1',
foo2: 'foo2',
foo3: 'foo3',
...(bar != null ? {bar} : {})
}
请参见以下示例:
const bar1 = null;
const result1 = {
foo1: 'foo1',
foo2: 'foo2',
foo3: 'foo3',
...(bar1 != null ? {bar: bar1} : {})
};
console.log("bar 'null':", result1);
const bar2 = undefined;
const result2 = {
foo1: 'foo1',
foo2: 'foo2',
foo3: 'foo3',
...(bar2 != null ? {bar: bar2} : {})
};
console.log("bar 'undefined':", result2);
const bar3 = "foo4";
const result3 = {
foo1: 'foo1',
foo2: 'foo2',
foo3: 'foo3',
...(bar3 != null ? {bar: bar3} : {})
};
console.log("bar 'foo4':", result3);
答案 1 :(得分:2)
您还可以在以后的步骤中决定要做什么:
result = Object.fromEntries(Object.entries(result).filter( ([_,v]) => ( v!= null)))
如果对象是不可变的,则可以创建一个新对象:
const defResult = Object.fromEntries(Object.entries(result).filter( ([_,v]) => ( v!= null)))
但是我担心那不是您所问的“短”
答案 2 :(得分:0)
您可以将其封装在函数中,以使用三元运算符更适当地处理它。三元运算符将确保您不会得到null或未定义。
const result: {
foo1: 'foo1',
foo2: 'foo2',
foo3: 'foo3',
bar: function(){
const bar = await request();
return (bar !== null || bar !== undefined)? bar: {};
}
}