【问题标题】:Add property to object when it's not null当它不为空时将属性添加到对象
【发布时间】:2017-03-31 20:17:44
【问题描述】:

我正在开发一个小型 API,我想使用 HTTP PATCH REQUEST 更新数据,而不使用一堆 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
    }
}

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

【问题讨论】:

    标签: javascript typescript javascript-objects


    【解决方案1】:

    您可以将Object.assign 与三元运算符结合使用:

    let data = Object.assign({},
      first === null ? null : {first},
      ...
    );
    

    这是因为Object.assign 会跳过null 参数。

    如果你确定属性值不会是“假的”,那么写起来会更短:

    let data = Object.assign({},
      first && {first},
      ...
    );
    

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

    let data = {
      first: first === null ? undefined : first,
      ...
    }
    

    【讨论】:

    • 谢谢。我现在明白了。我忘了告诉我我正在使用打字稿,我认为它会很相似,但是当我编译到 ES5 时,打字稿的 ObjectConstructor 中没有 Object.assign 函数。我用你关于字符串化数据的提示做到了。当我将数据设置为未定义且不为空时,它们还没有被字符串化,这非常简单!谢谢!
    • 第一个代码段中的|| 应该是: 每个典型的三元结构吗?或者这是我不熟悉的其他巫术?
    【解决方案2】:

    根据你使用的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 },
    });
    

    【讨论】:

      【解决方案3】:

      非内联解决方案

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

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

      注意:如果值为 false,这将不起作用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-09
        • 2015-09-21
        • 2015-11-15
        • 1970-01-01
        • 2021-03-22
        • 2018-07-27
        • 2016-09-25
        相关资源
        最近更新 更多