筛选出null或未定义的属性

时间:2020-09-09 10:33:06

标签: javascript node.js typescript

我有一个属性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,这种方法就行不通了

3 个答案:

答案 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: {};
    }
}