有条件地设置对象属性

时间:2013-08-02 14:46:39

标签: javascript

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

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 })
);

6 个答案:

答案 0 :(得分:31)

这样做:

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

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


编辑:从评论中可以看出,实际上并没有涉及JSON。 OP正在使用$.ajax,因此可能会使用$.param。遗憾的是,$.param确实为值为undefined的属性创建了一个条目。所以没有任何补充代码行可能没有解决方案。

答案 1 :(得分:22)

使用ifolded.asIndex

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

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

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

答案 2 :(得分:8)

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

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

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

答案 3 :(得分:3)

你可以这样做:

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

答案 4 :(得分:1)

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

解决方案:

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

答案 5 :(得分:0)

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

2017-08-23T10:12:10.764+02:00 [APP/PROC/WEB/0] [OUT] 2017-08-23 08:12:10.764 INFO 19 --- [ Timer-0] o.s.c.n.turbine.EurekaInstanceDiscovery : Fetching instances for app: log-test
2017-08-23T10:12:10.764+02:00 [APP/PROC/WEB/0] [OUT] 2017-08-23 08:12:10.764 INFO 19 --- [ Timer-0] o.s.c.n.turbine.EurekaInstanceDiscovery : Received instance list for app: log-test, size=2
2017-08-23T10:12:10.764+02:00 [APP/PROC/WEB/0] [OUT] 2017-08-23 08:12:10.763 INFO 19 --- [ Timer-0] o.s.c.n.t.CommonsInstanceDiscovery : Fetching instance list for apps: [log-test]
2017-08-23T10:12:10.764+02:00 [APP/PROC/WEB/0] [OUT] 2017-08-23 08:12:10.764 INFO 19 --- [ Timer-0] c.n.t.discovery.InstanceObservable : Retrieved hosts from InstanceDiscovery: 2
2017-08-23T10:12:10.765+02:00 [APP/PROC/WEB/0] [OUT] 2017-08-23 08:12:10.764 INFO 19 --- [ Timer-0] c.n.t.discovery.InstanceObservable : Found hosts that have been previously terminated: 0
2017-08-23T10:12:10.765+02:00 [APP/PROC/WEB/0] [OUT] 2017-08-23 08:12:10.764 DEBUG 19 --- [ Timer-0] c.n.t.discovery.InstanceObservable : Retrieved hosts from InstanceDiscovery: [StatsInstance [hostname=log-test.myurl:80, cluster: LOG-TEST, isUp: true, attrs={securePort=443, fusedHostPort=log-test.myurl:443, instanceId=log-test:97d83c44-8b9e-44c4-56b4-742cef7bada0, port=80}], StatsInstance [hostname=log-test.myurl:80, cluster: LOG-TEST, isUp: true, attrs={securePort=443, fusedHostPort=log-test.myurl:443, instanceId=log-test:3d8359e4-a5c1-4aa0-5109-5b49a77a1f6f, port=80}]]
2017-08-23T10:12:10.765+02:00 [APP/PROC/WEB/0] [OUT] 2017-08-23 08:12:10.764 INFO 19 --- [ Timer-0] c.n.t.discovery.InstanceObservable : Hosts up:1, hosts down: 0

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