【问题标题】:Conditionally set an object property有条件地设置对象属性
【发布时间】:2013-08-02 14:46:39
【问题描述】:

是否有一些基于条件设置属性的语法?

data: {
    userId: 7,
    actionId: 36,
    express: (myCondition ? true : null) // does not work
}

我希望将express 设置为一个值或根本不设置(即,不应该有名为express 的键),并且在定义之后没有额外的语句。我知道我可以将它用作布尔值,但接收方正在使用isset() 检查,我想知道是否可以避免修改它。


编辑:似乎没有直接解决问题的方法。以下是最接近的建议:

JSON.stringify(Chris Kessel,dystroy):

var json = JSON.stringify( {
    data: {
        userId: 7,
        actionId: 36,
        express: (myCondition ? true : null)
    }
});

匿名函数(Paulpro):

var data = new function(){
    this.userId = 7;
    this.actionId = 36;
    myCondition && (this.express = true);
};

额外声明 (x4rf41):

data: {
    userId: 7,
    actionId: 36
}
if(myCondition) data["express"] = true;

Eval(我以前的同事):

eval("data = {userId: 7, actionId: 36 " + (myCondition ? ", express: true}" : "}"))

条件定义(不知道怎么标注这个):

data = (
    (myCondition && { userId: 7, actionId: 36, express: true }) ||
    (!myCondition && { userId: 7, actionId: 36 })
);

【问题讨论】:

  • 当您说“根本没有设置”时,您的意思是该属性存在但值为undefined,还是该属性不存在?
  • 我的意思是该属性根本不应该存在。
  • @mcmlxxxvi 我认为您的意思是对象属性,而不是 JSON 属性。您的问题中没有 JSON。
  • @Paulpro:我认为你是对的 :)

标签: javascript


【解决方案1】:

使用spread operator

data: {
    userId: 7,
    actionId: 36,
    ...myCondition && {express: true}
}

请注意,如果您使用Flow,该语法可能会产生类型检查错误。您可以将上述内容写得更明确,更简洁,如下:

data: {
    userId: 7,
    actionId: 36,
    ...(myCondition ? {express: true} : {})
}

【讨论】:

  • 这是一个很好的答案。
【解决方案2】:

这样做:

data: {
    userId: 7,
    actionId: 36,
    express: (myCondition ? true : undefined)
}

当您将stringify 对象写入JSON 时,不会将值为undefined 的属性写入。


编辑:从 cmets 看来,实际上没有涉及 JSON。 OP 正在使用$.ajax,所以可能使用了$.param。不幸的是,$.param 确实为值为undefined 的属性创建了一个条目。因此,如果没有任何补充代码行,可能就没有解决方案。

【讨论】:

  • 我只是将它提供给 AJAX 调用,它并没有被剥离 - 我没有明确地将其字符串化 ATM。
  • 我不知道您的 API,但几乎可以肯定它正在调用 JSON.stringify。即使没有,规范也不允许传递未定义的值,因此任何 API 必须删除值为 undefined 的属性。
  • 我正在使用 jQuery,我不知道它对对象做了什么,但属性仍然存在。
  • +1 表示 JSON.stringify 忽略未定义的属性。学到了新东西,谢谢
  • 如果不生成 JSON,则与 JSON 没有关系。
【解决方案3】:

如果您使用匿名函数而不是对象字面表示法定义对象,则可以这样做:

var data = new function(){
    this.userId = 7;
    this.actionId = 36;
    myCondition && (this.express = true);
};

生成的 data 对象完全相同,只是 constructor 将是匿名函数,而不是 window.Object

【讨论】:

    【解决方案4】:

    你可以这样做:

    var json = JSON.stringify( {
        data: {
            userId: 7,
            actionId: 36,
            express: (myCondition ? true : null)
        }
    });
    

    【讨论】:

    • null 未被剥离,undefined 被剥离。
    • 是的,非常正确。我只是在我的代码中重复了原始代码中的内容。
    【解决方案5】:

    有点旧,但你也可以做一个很好的解决方案:

    data: {
        userId: 7,
        actionId: 36
    }
    
    Object.assign(data, !myCondition && { express: yourValue });
    

    因此,如果您的条件为假,它将为您的 express 属性分配您需要的值。

    【讨论】:

      【解决方案6】:

      首先,这是 javascript,而不是 JSON。

      解决办法:

      data: {
          userId: 7,
          actionId: 36
      }
      if(myCondition) data["express"] = true;
      

      【讨论】:

      • 这不是一个真正的答案:“在定义之后没有额外的 statemets”。显然 OP 知道他能做到。
      • 这在 ES6 中不起作用。向我展示更漂亮和 linting 的错误
      【解决方案7】:

      扩展运算符现在解决了这个问题。这是一个带有两个比较的示例。

      注意:我将date: 更改为const date = ,以便它是有效的可运行javascript。如果它应该位于深层对象结构内,它也可以与 data: 一起使用。

      const compareValue = 13;
      const data =  {
          userId: 7,
          actionId: 36,
          ...(compareValue > 10 && {propertyForGreaterThan10: 'foo'}),
          ...(compareValue < 10 && {propertyForLessThan10: 'bar'}),
      }
      console.log(data);

      【讨论】:

        猜你喜欢
        • 2018-10-26
        • 2017-05-28
        • 1970-01-01
        • 2022-11-18
        • 2019-08-19
        • 1970-01-01
        • 1970-01-01
        • 2015-03-01
        • 2018-04-19
        相关资源
        最近更新 更多