2012-06-04 68 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。