2012-06-04 46 views
1

所以,我承认自己有点JS小白的,但据我所知,这应该是工作,这是不是。循环执行阵列和比较正则表达式

背景:

我有一个3列表框的形式。列表框被命名为app1,db1和db2。我使用javascript来允许用户添加额外的列表框,增加每个额外选择框的名称标签。

当我添加额外的命名箱的应用程序,值递增适当为每个附加字段。如果我尝试添加名为select的addtional db,它无法识别通过该数组的第一个循环中的第二个标记。这使我最终得到了2个名为db2的元素。在每个后续标签上,它都被正确识别并正确递增。

下面是DB1标记HTML:

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

和DB2:

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

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

function return_select_name(tag, tags) { 
    matches = new Array(); 
    var re = new RegExp(tag + "\\d+", "g"); 
    for (var i = 0; i < tags.length; i++) { 
    var found = re.exec(tags[i]); 
    if (found != null) { 
     matches.push(found[0]); 
    } 
    } 
    matches = matches.sort(); 
    index = parseInt(/\d+/.exec(matches.last())) + 1; 
    index = tag + index; 
    return index; 
} 

如果我添加一个应用程序标记,它将返回'app2'。如果我搜索了分贝标签,它会通过,DB3 2号,等等,等等

所以基本上,我敢肯定,我在这里做一些错误返回的第一次“DB2”。

+0

这是不是很清楚你在这里试图达到什么。您是否尝试生成像'db1','db2','db3'等等一样的顺序名称?然后,如果您通过“应用程序”,想让它从“app1”开始? – arb

+0

基本上是的。只有使用应用程序,它才能返回app2。 – Eugene

+0

我添加了'prototypejs'标签,因为如果没有它,代码将无法工作。 – Guffa

回答

2

我会通过保持为DB计数器和一个计数器,用于应用程序用来生成的名字办理。

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); 
.. 
+0

我喜欢这个,我让它变得比它需要的更复杂。 – Eugene

+0

@Eugene:很高兴我能帮忙:) – Briguy37

1

你得到的问题是,regex对象是有状态的。您可以通过在循环内部创建正则表达式来修复程序。

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; 
} 

在任何情况下,如果我这个做我自己,我可能会更愿意避免cmplicated文本匹配,只是存储下一个标签指数在一个变量或哈希映射。


另一项建议:如果你把括号中您正则表达式:

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

然后你可以使用found[1]直接得到你的电话号码,而无需额外的步骤之后。

0

我知道这已经回答了,但我把这个一起作为一个概念证明。

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

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

console.debug只适用于Chrome和FF。