当对象不为null时,将属性添加到对象

Daw*_*ski 7 javascript javascript-objects typescript

我正在开发一个小API,我想尝试使用HTTP PATCH REQUEST而不使用一堆if语句来更新数据.我正在尝试仅使用更改的数据填充传出数据对象.

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

    let data: IPatchProfile = {
        // something like --> property != null ? property: property.value : nothing
    }
}
Run Code Online (Sandbox Code Playgroud)

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

小智 19

根据您使用的 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 },
});
Run Code Online (Sandbox Code Playgroud)


Gib*_*olt 13

非内联解决方案

如果您不需要内联添加值,那么像这样编写作业就非常简单明了。

const val1 = 1
const val2
const data = {}

val1 && (data.a = val1) // 1
val2 && (data.b = val2) // Not added
// data = { a : 1 }
Run Code Online (Sandbox Code Playgroud)

注意:如果该值是假的,这将不起作用


小智 8

你可以使用Object.assign:

let data = Object.assign({},
  first === null ? null || {first},
  ...
);
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为Object.assign将跳过null参数.

如果您确定属性值不是"伪造",那么写入会更短:

let data = Object.assign({},
  first && {first},
  ...
);
Run Code Online (Sandbox Code Playgroud)

假设对象将在某个时刻被字符串化,因为字符串化会忽略未定义的值,您也可以尝试

let data = {
  first: first === null ? undefined : first,
  ...
}
Run Code Online (Sandbox Code Playgroud)