有条件地设置对象属性

mcm*_*xvi 42 javascript

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

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

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


编辑:似乎没有直接解决问题的方法如上所述.以下是密切的建议:

JSON.stringify(Chris Kessel,dystroy):

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

一个匿名函数(Paulpro):

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

额外声明(x4rf41):

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

Eval(我以前的同事):

eval("data = {userId: 7, actionId: 36 " + (myCondition ? ", express: true}" : "}"))
Run Code Online (Sandbox Code Playgroud)

条件定义(不知道如何标记这个):

data = (
    (myCondition && { userId: 7, actionId: 36, express: true }) ||
    (!myCondition && { userId: 7, actionId: 36 })
);
Run Code Online (Sandbox Code Playgroud)

Den*_*ret 39

像这样做 :

data: {
    userId: 7,
    actionId: 36,
    express: (myCondition ? true : undefined)
}
Run Code Online (Sandbox Code Playgroud)

将对象字符串化为 JSON undefined时,不会写入其值为的属性.


编辑:从评论中可以看出,实际上没有涉及JSON.OP使用$.ajax这样$.param很可能使用.$.param不幸的是,确实为值为的属性创建了一个条目undefined.所以没有任何补充代码行可能没有解决方案.

  • +1为JSON.stringify忽略未定义的属性.学到了新的东西,谢谢 (3认同)
  • 如果您不生成JSON,则与JSON无关。 (2认同)

eri*_*oco 34

使用扩展运算符.

data: {
    userId: 7,
    actionId: 36,
    ...myCondition && {express: true}
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用的是Flow,则该语法可能会生成类型检查错误.您可以更明确地编写上述内容,而不是简洁,如下所示:

data: {
    userId: 7,
    actionId: 36,
    ...(myCondition ? {express: true} : {})
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案。 (2认同)

Pau*_*aul 8

如果使用匿名函数而不是对象文字表示法定义对象,则可以执行此操作:

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

结果data对象完全相同,除了它将constructor是匿名函数而不是window.Object.


x4r*_*f41 5

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

解决方案:

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