JavaScript - 用于在字符串中查找文本的函数

时间:2017-05-10 17:21:16

标签: javascript arrays function

我有一个函数,用于传递表字段名称及其值。根据字段的名称,它可以将内容作为链接返回,也可以不返回。

// 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 EmailSup NTID,并且这些字段名称未正确转换。

预期结果:

createLink('sup email', 'bob2@stuff2.com') // returns <a href="mailto:bob2@stuff2.com">bob@stuff.com</a>

问题:

如何调整我的函数以查看输出数组中是否存在field,即使它不完全匹配?

3 个答案:

答案 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"));