我有一个函数,用于传递表字段名称及其值。根据字段的名称,它可以将内容作为链接返回,也可以不返回。
// Given a field name, check to see if its in our output. If so, return the formatted link
function createLink(field, val) {
var output = {
'ntid': 'https://web.internal/profile/' + val,
'email': 'mailTo:' + val
};
var i, key, keys = Object.keys(output);
for ( i = 0; i < keys.length; ++i ) {
key = keys[i];
if(field.toLowerCase() == key){
return '<a href="'+output[key]+'" target="_blank">'+val+'</a>';
}
}
return val;
}
用法:
createLink('email', 'bob@stuff.com')
// returns <a href="mailto:bob@stuff.com">bob@stuff.com</a>
这也适用于NTID
。我遇到的问题是,有些字段名称在输出中包含我的值,例如Sup Email
或Sup NTID
,并且这些字段名称未正确转换。
预期结果:
createLink('sup email', 'bob2@stuff2.com')
// returns <a href="mailto:bob2@stuff2.com">bob@stuff.com</a>
问题:
如何调整我的函数以查看输出数组中是否存在field
,即使它不完全匹配?
答案 0 :(得分:2)
将您的功能更改为
function createLink(field, val) {
var output = {
'ntid': 'https://web.internal/profile/' + val,
'email': 'mailTo:' + val
};
var i, key, keys = Object.keys(output);
for (i = 0; i < keys.length; ++i) {
key = keys[i];
if ((field.toLowerCase()).includes(key)) {
return '<a href="' + output[key] + '" target="_blank">' + val + '</a>';
}
}
return val;
}
console.log(createLink('sup email', 'bob2@stuff2.com') )
注意代码if ((field.toLowerCase()).includes(key)) {
这将检查字符串
key
子字符串
答案 1 :(得分:0)
您可以使用String.prototype.indexOf
。
indexOf()方法返回第一次出现的指定值的调用String对象中的索引...如果找不到该值,则返回-1。
所以你的代码看起来像是:
// Given a field name, check to see if its in our output. If so, return the formatted link
function createLink(field, val) {
var output = {
'ntid': 'https://web.internal/profile/' + val,
'email': 'mailTo:' + val
};
var i, key, keys = Object.keys(output);
for ( i = 0; i < keys.length; ++i ) {
key = keys[i];
if(field.toLowerCase().indexOf(key) >= 0){ //CHANGE HERE
return '<a href="'+output[key]+'" target="_blank">'+val+'</a>';
}
}
return val;
}
答案 2 :(得分:0)
您正在实施的是Strategy Pattern。策略模式依赖于某种形式的行为切换,具体取决于方法的输入。在您的情况下,该切换基于第一个参数。
您 想要做的是您的问题是如何做的。您不希望假设您的应用程序中包含“email”或其他字符串的每个字段名称都保证是一个电子邮件地址,由相同的策略处理。
创建一个字段名称和策略表,用于显示每个字段;并使用“enum-ish”对象作为策略的定义。
function create_link(field, val) {
const strategy = create_link.Field_Strategies[field];
if (typeof strategy === 'undefined') {
console.log("Using default strategy");
return val;
}
console.log("Using " + strategy);
switch (strategy) {
case create_link.Strategies.EMAIL:
return '<a href="mailto:' + val + '" target="_blank">' + val + '</a>';
case create_link.Strategies.NTID:
return '<a href="https://web.internal/profile/' +
val + '" target="_blank">' + val + '</a>';
case create_link.Strategies.SOME_FIELD:
return '<a href="http://example.com/some/path/' +
encodeURIComponent(val) +
'" target="_blank">' + val + '</a>';
}
}
create_link.Strategies = {
EMAIL: "email strategy",
NTID: "ntid strategy",
SOME_FIELD: "somefield strategy"
};
create_link.Field_Strategies = {
"Sup email": create_link.Strategies.EMAIL,
"E-mail": create_link.Strategies.EMAIL,
"Email": create_link.Strategies.EMAIL,
"NTID": create_link.Strategies.NTID,
"Foobar baz": create_link.Strategies.SOME_FIELD
};
console.log(create_link("foo","foofoofoo"));
console.log(create_link("Sup email","supervisor@example.com"));
console.log(create_link("E-mail","foo@example.com"));
console.log(create_link("Email","bar@example.com"));
console.log(create_link("NTID","10983409509734"));
console.log(create_link("Foobar baz","Aleph null"));