【问题标题】:What is the best way to conditionally add key/value pairs to an object [closed]有条件地将键/值对添加到对象的最佳方法是什么[关闭]
【发布时间】:2019-12-31 03:57:34
【问题描述】:

我正在向我的后端发送一些数据,并且我只想在我的表单数据中添加包含值的键/值对。

目前,如果它们的长度大于零,我会有条件地添加这些值。

const personDetails = this.personDetails;
let formData = {}

if (personDetails.email.length) {
  formData.email = personDetails.email;
}
if (personDetails.phone.length) {
  formData.phone = personDetails.phone;
}

axios.put(url, formData).then(() => blah);

有没有更简洁的方法?

【问题讨论】:

  • 我不这么认为。
  • 您可以遍历对象并检查每个键和值对,而不是单独指定它们。
  • 我使用以下帖子中包含的 formtojson.js 代码。不记得我是从书本还是网站上得到的。我通过搜索其中包含的一个 cmets 找到了在线参考。 stackoverflow.com/questions/46509681/…

标签: javascript


【解决方案1】:

您可以使用条件运算符一次声明所有对象:

const { email, phone } = this.personDetails;
const formData = {
  email: email.length ? email : undefined,
  phone: phone.length ? phone : undefined
};

这与您的原始代码严格等效,因为在这里,属性将存在于对象上,无论如何(但如果不满足条件,关联的值将是undefined)。但是由于结果在发送时会被字符串化,所以这应该不是问题。

如果在其他地方使用了formData,并且您明确地迭代属性,则必须首先确保与该属性关联的值不是undefined

【讨论】:

    【解决方案2】:

    我实际上建议即使使用if 语句进行条件赋值:

    formData.email = personDetails.email;
    formData.phone = personDetails.phone;
    

    相反,始终只分配电子邮件和电话,即使它们为空或为空。接收输入 JSON 的服务器端应用程序很可能正在使用期望这些字段存在的模型,即使未分配也是如此。即使不添加电子邮件或电话密钥,您所获得的收益也相当小。

    【讨论】:

    • 在这种情况下,他可以简单地使用formData = {email: personDetails.email, phone: personDetails.phone}; 而不是多个分配。
    【解决方案3】:

    如果您有很多字段要执行此操作,则可以使用循环,这样您就不必重复 if 语句。

    ["email", "phone", ...].forEach(field => {
        if (personDetails[field].length) {
            formData[field] = personDetails[field];
        }
    });
    

    【讨论】:

      【解决方案4】:

      下面的快速方法来检查长度是否等于或大于您的需要。

      var minLength = 6;    
      for (var key in personDetails) {
          if (personDetails[key].length >= minLength) {
              formData[key] = personDetails[key];
          }
      }
      

      【讨论】:

      • 这取决于personDetails只有需要添加到formData的键,并且还取决于每个值都是一个数组
      • 这只是我如何解决这个问题的一个想法。提问者自己担心验证,因为没有人比他更了解真实结构。
      猜你喜欢
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 2020-06-25
      • 2021-04-02
      • 2018-09-05
      • 2018-05-27
      相关资源
      最近更新 更多