循环数组并与正则表达式进行比较

时间:2012-06-04 13:14:08

标签: javascript prototypejs

所以,我承认自己是一个JS菜鸟,但据我所知,这应该是有效的,但事实并非如此。

背景:

我有一个包含3个列表框的表单。列表框名为app1,db1和db2。我正在使用javascript来允许用户添加其他列表框,增加每个附加选择框的名称标签。

当我添加其他应用程序命名框时,该值会针对每个其他字段正确递增。如果我尝试添加名为choices的addtional db,它将无法识别通过该数组的第一个循环上的第二个标记。这导致我最终得到2个名为db2的元素。在每个后续标记上,它被正确识别并正确递增。

这是db1标记的HTML:

<select name="db1">
  *options*
</select>

和db2:

<select name="db2">
  *options*
</select>

标签是相同的。这是我用来计算序列中下一个数字的函数(注意:标签是app或db,标签是DOM中所有选择标签名称的数组,如果我检查标签,它会给我{{ 1}}):

['app1', 'db1', 'db2', '']

如果我添加了应用标记,则会返回“app2”。如果我搜索db标记,它将在第一次返回'db2',在第二次返回db3等等。

所以基本上,我确定我在这里做错了。

3 个答案:

答案 0 :(得分:2)

我会通过保留db的计数器和app用于生成名称的计数器来处理它。

var appCounter = 1;//set this manually or initialize to 0 and
var dbCounter = 2;//use your create function to add your elements on pageload

然后,当您创建下一个标记时,只需递增计数器并将其用作您姓名的后缀:

var newAppElement = document.createElement('select');
newAppElement.name = 'app' + (++appCounter);
..

//  --OR for the db element--

var newDbElement = document.createElement('select');
newDbElement.name = 'db' + (++dbCounter );
..

答案 1 :(得分:1)

您遇到的问题是正则表达式对象是有状态的。您可以通过将正则表达式创建放在循环中来修复程序。

function return_select_name(tag, tags) {
  matches = new Array();
  // <-- regex was here
  for (var i = 0; i < tags.length; i++) {
    var re = new RegExp(tag + "\\d+", "g"); //<--- now is here
    var found = re.exec(tags[i]);
    if (found != null) {
      matches.push(found[0]);
    }
  }
  matches = matches.sort();
  index = parseInt(/\d+/.exec(matches[matches.length-1])) + 1; //<--- I dont think matches.last is portable, btw
  index = tag + index;
  return index;
}

在任何情况下,如果我自己这样做,我可能更愿意避免复制文本匹配,只是将下一个标记索引存储在变量或哈希映射中。


另一个建议:如果你在你的正则表达式中加上括号:

// /tag(\d+)/
var re = new RegExp(tag + "(\\d+)", "g");

然后您可以使用found[1]直接获取您的号码,之后不需要额外的步骤。

答案 2 :(得分:0)

我知道这已经得到了解答,但我把它放在一起作为概念证明。

http://jsfiddle.net/zero21xxx/LzyTf/

这是一个对象,所以你可以在不同的场景中重用它。显然有一些方法可以改进,但我认为这很酷,所以我想我会分享。

console.debug仅适用于Chrome和FF。