【问题标题】:One string multiple variables to check with indexOf一串多个变量用 indexOf 检查
【发布时间】:2012-03-17 00:37:35
【问题描述】:

我为我们的表单编写了一个小的 JQuery / Javascript 插件,它接受一个全名输入并将其分解为名字和姓氏组件。如果输入中有三个或更多名称,它会打开一个模式并询问哪个组合是正确的。

我的下一步是查找并删除可能已输入的任何后缀,例如 Jr、Sr、III 等。我目前正在删除最后四个字符并使用 indexOf 检查它们是否包含后缀字符串 ( Jr、Sr、III 等)。但是每一行只检查一个可能的后缀,我想知道是否有一些 js 魔法可以检查一行中的多个后缀。我当前的代码如下:

var nameVal = $('#name').val();    
var suffix = nameVal.slice(-4);
if (suffix.toLowerCase().indexOf(" jr") != -1)  { 
    var nameSplit = nameVal.slice(0, -3).split(" "); 
} elseif (suffix.toLowerCase().indexOf(" iii") != -1)  { 
    var nameSplit = nameVal.slice(0, -4).split(" "); 
} else {
    var nameSplit = nameVal.split(" "); }

我总能做好老人||并继续添加具有不同 indexOf 值的额外 (suffix.toLowerCase().indexOf("jr") != -1),但我希望尽可能保持代码更紧凑,我的“小”脚本已经 3k。

一旦我得到这个排序,最后一步将弄清楚如何保留姓氏值,以便在输入其他名称并再次调用脚本时进一步向下查看是否选择了姓氏匹配新条目并绕过模态弹出窗口。

【问题讨论】:

  • 在这样的块内定义变量时,您将得到非常意想不到的结果。了解有关范围和提升的更多信息here
  • @jbabey:很难进入有问题的情况,除非您在代码中声明变量之前使用它们。此外,大多数人使用for (var i=0; i < len; i++) 定义他们的循环。提升不是这里的问题,为了清楚起见,var nameSplit应该在if声明的上方

标签: javascript jquery string indexof


【解决方案1】:

您可以使用正则表达式。试试这样的;

nameVal = nameVal.replace(/ (jr|sr|I?II)$/gi, "");

更详细;

(jr|sr|I?II) = jr or sr or II or III
$ = at the end of line
/i = case insensitive
/g match globally

【讨论】:

  • 我知道必须有更好的方法。谢谢,这就像一个魅力。
  • 不完全确定 OP 的意图,但 /g 也可能是有序的
  • @Tom 我稍微改了一下。现在它在后缀前需要一个空格,并同时处理 II 和 III(I?II 表示可选的 I,后跟 II)。
  • @Tom /g 表示全局匹配。因此,它将所有匹配项更改为“”。但是,由于我们匹配行尾,在这种情况下它只会影响多行字符串。
  • 再次感谢。实际上,我们希望去除各种后缀,Jr、Sr、II、III、IV、PHD、MD 等。但是将它们添加到替换中会比我的旧方法容易得多。
【解决方案2】:

最好为此使用正则表达式,例如:

var names = [
  "Joe Jr.",
  "Mark Sr.",
  "Loui III",
  "Mark Lockering",
];

var suffixRes = [
  /Jr\.$/, /Sr\.$/, 'III', 
];
$(names).each(function(i, name) {
   var str = name;
   $(suffixRes).each(function(j, suffixRe) {
       str = str.replace(suffixRe, '');
   });
   console.log(str);
});

活生生的例子:

【讨论】:

  • 我只希望一次处理一个名称,该名称已输入到我们网页上的表单输入中。
  • 同意,我说的是显示不同输入的输出,仅此而已。只需使用函数的要点(即删除主函数周围的 $(names).each(...) 调用)。
【解决方案3】:

在这种情况下,我通常会创建一个值数组,(因为我不擅长正则表达式)

var suffixArr = [' jr',' iii', ' ii'];

//then run a loop

for(var i = 0; i < suffixArr.length;i++){
    if(suffixArr[i].toLowerCase().indexOf(suffixArr[i]) != -1){
       nameSplit = nameVal.slice(0, - suffixArr[i].length).split(" "); 
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多