当对象不为空时,添加属性

53

我正在开发一个小型的API,并想使用 HTTP PATCH请求 更新数据,而不使用大量的if语句。我试图只将更改后的数据填充到传出数据对象中。

update() {
    let prop1 = hasBeenChanged.prop1 ? changedData.prop1 : null;
    // ...
    let propN = hasBeenChanged.propN ? changedData.propN : null;

    let data: ISomething = {
        // something like --> property != null ? property: property.value : nothing
    }
}

有没有办法动态创建数据对象?

3个回答

65
你可以使用 Object.assign 与三元运算符结合使用:
let data = Object.assign({},
  first === null ? null : {first},
  ...
);

这个代码之所以能够运行,是因为Object.assign会跳过null参数。
如果你确定属性值不会是“falsy”,那么可以更简洁地编写代码:
let data = Object.assign({},
  first && {first},
  ...
);

假设该对象在某个时刻将被字符串化,由于字符串化会忽略未定义的值,因此您也可以尝试:
let data = {
  first: first === null ? undefined : first,
  ...
}

谢谢。我现在明白了。我忘记告诉你我正在使用TypeScript,我以为它会很相似,但是当我编译成ES5时,在ObjectConstructor中没有Object.assign函数。我按照你的提示使用了字符串化数据来解决这个问题。当我将数据设置为undefined而不是null时,它们没有被字符串化,这非常好和容易!谢谢! - Dawid Zbiński
1
在第一个代码段中,|| 应该改成 : 来符合典型的三元条件语句结构吗?还是说这是一些我不熟悉的其他魔法操作? - SheffDoinWork

53

根据您使用的JS版本,您可以使用展开运算符...

const getData = data => ({
  ...data.first  && { 'Custom First Prop Name': data.first },
  ...data.second && { 'Custom Second Prop Name': data.second },
  ...data.third  && { third: data.third },
  ...data.fourth && { fourth: data.fourth },
});

13

非内联解决方案

如果您不需要在内联中添加值,那么编写分配语句的方法非常直截了当和清晰。

const val1 = 1
const val2
const data = {}

val1 && (data.a = val1) // 1
val2 && (data.b = val2) // Not added
// data = { a : 1 }

注意:如果该值为假,则此方法不起作用。


括号是我错过的。 - Sahin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接