是否有一些基于条件设置属性的语法?
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 })
);
答案 0 :(得分:31)
这样做:
data: {
userId: 7,
actionId: 36,
express: (myCondition ? true : undefined)
}
当您将对象stringify发送到JSON时,不会写入值为undefined
的属性。
编辑:从评论中可以看出,实际上并没有涉及JSON。 OP正在使用$.ajax
,因此可能会使用$.param
。遗憾的是,$.param
确实为值为undefined
的属性创建了一个条目。所以没有任何补充代码行可能没有解决方案。
答案 1 :(得分:22)
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
因此,如果条件为假,它将为您的快递属性分配所需的值。