首页 > 解决方案 > 过滤掉 null 或未定义的属性

问题描述

我有一个财产bar可以是undefinednull

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

标签: javascriptnode.jstypescript

解决方案


您可以bar通过首先计算的值有条件地添加bar(就像您在第二个示例中一样):

const bar = await some?.http?.request?.that?.can?.be?.undefined?.or?.null

然后,当您创建时,result您使用三元条件运算符返回一个对象{bar: <value>}或一个空对象{},然后您可以使用扩展语法将其合并到结果对象中:

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);


推荐阅读