如何解决Adobe Campaign:Javascript XML E4X Switch Case
我开发了以下脚本,它混合了 javascript、xml、e4x(由 adobe 活动使用)。该脚本基本上遍历每一行并为每个开关执行案例内的代码。我正在寻找一种方法来简化开关/外壳,因为它们有点多余?有人可以提出更好的方法吗?
var query = xtk.queryDef.create(
<queryDef schema="temp:enrich" operation="select">
<select>
<node expr="@id"/>
<node expr="@fun"/>
<node expr="@news"/>
<node expr="@events"/>
<node expr="@student"/>
</select>
</queryDef>)
var result = query.ExecuteQuery();
for each(var i in result.enrich)
{
//Debug: logInfo(i.@id+ " "+i.@fun+" " +i.@news+" " +i.@student);
var recipient = <recipient _key = "@id" id = {i.@id} />;
var fun = parseInt(i.@fun);
var news = parseInt(i.@news);
var events = parseInt(i.@events);
var student = parseInt(i.@student);
switch(fun) {
case 0:
nms.subscription.Unsubscribe("uosFunStuff",recipient);
break;
case 1:
nms.subscription.Subscribe("uosFunStuff",recipient,false);
break;
default:
// donothing
}
switch(news) {
case 0:
nms.subscription.Unsubscribe("uosUniversityNews",recipient);
break;
case 1:
nms.subscription.Subscribe("uosUniversityNews",false);
break;
default:
// donothing
}
switch(events) {
case 0:
nms.subscription.Unsubscribe("uosEvents",recipient);
break;
case 1:
nms.subscription.Subscribe("uosEvents",false);
break;
default:
// donothing
}
switch(student) {
case 0:
nms.subscription.Unsubscribe("uosStudentLife",recipient);
break;
case 1:
nms.subscription.Subscribe("uosStudentLife",false);
break;
default:
// donothing
}
}
解决方法
大量重复的代码和一些替换让我想到使用带有地图的单独函数。
function updateSubscription(val,label,recipient) {
if (val) {
nms.subscription.Unsubscribe(label,recipient);
} else {
nms.subscription.Subscribe(label,recipient,false);
}
}
for each(var i in results.enrich()) {
//Debug: logInfo(i.@id+ " "+i.@fun+" " +i.@news+" " +i.@student);
var recipient = <recipient _key = "@id" id = {i.@id} />;
updateSubscription(parseInt(i.@fun),'uosFunStuff',recipient);
updateSubscription(parseInt(i.@news),'uosUniversityNews',recipient);
updateSubscription(parseInt(i.@events),'uosEvents',recipient);
updateSubscription(parseInt(i.@student),'uosStudentLife',recipient);
}
作为旁注,通常最好在 switch 上使用 if-else,直到您有大约 5 个选项。对此有很多注意事项,但对于零或一,if-else 是一个更好的主意。
,介绍
可以通过 3 种方式优化代码。由于我仅在 javascript 中进行了测试,因此您必须了解哪些对您有用。
标签和函数数组
var labels = ["uosFunStuff","uosUniversityNews","uosEvents","uosStudentLife"];
var functionArray = [
function(input){return parseInt(input.@fun) },function(input){return parseInt(input.@news) },function(input){return parseInt(input.@events) },function(input){return parseInt(input.@student) }
];
for each(var i in results.enrich()) {
var recipient = <recipient _key = "@id" id = {i.@id} />;
var functionIndex = 0;
for each(var label in labels) {
if(functionArray[functionIndex++](i) == 1){
nms.subscription.Subscribe(label,false);
}else{
nms.subscription.Unsubscribe(label,recipient);
}
});
}
标签数组,键数组
var labels = ["uosFunStuff","uosStudentLife"];
var keys = [ "@fun","@news","@events","@student"];
for each(var i in results.enrich()) {
var recipient = <recipient _key = "@id" id = {i.@id} />;
var functionIndex = 0;
for each(var label in labels) {
if(parseInt(i[keys[functionIndex++]])== 1){
nms.subscription.Subscribe(label,recipient);
}
});
}
对象(这个可能不起作用)
var labelsAndKeys = {
uosFunStuff:"@fun",uosUniversityNews:"@news",uosEvents:"@events",uosStudentLife:"@student"
};
for each(var i in results.enrich()) {
var recipient = <recipient _key = "@id" id = {i.@id} />;
for each(var label in labels) {
if(parseInt(i[labelsAndKeys[labels])== 1){
nms.subscription.Subscribe(label,recipient);
}
});
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。