2012-06-04 4 views
1

그래서 나는 JS 놈의 비트가되는 것을 인정할 것이다. 그러나 내가 말할 수있는 한, 이것은 작동해야하고 그렇지 않다.배열을 반복하고 정규식과 비교하기

배경 :

나는 3 개 목록 상자 양식을 가지고있다. 목록 상자의 이름은 app1, db1 및 db2입니다. 사용자가 추가 목록 상자를 추가 할 수 있도록 자바 스크립트를 사용하여 각 추가 선택 상자의 이름 태그를 늘립니다.

추가로 이름이 지정된 응용 프로그램 상자를 추가하면 값이 추가 필드마다 올바르게 증가합니다. select라는 addtional db를 추가하려고하면 배열을 통해 첫 번째 루프의 두 번째 태그를 인식하지 못합니다. 이로 인해 DB2라는 이름의 2 개의 요소가 생깁니다. 각 후속 태그에서 올바르게 인식되고 올바르게 증가합니다.

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

및 DB2 :

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

태그가 동일한 여기

은 DB1 태그의 HTML입니다. 다음은 시퀀스의 다음 숫자를 알아 내기 위해 사용하는 함수입니다 (태그는 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; 
} 

app 태그를 추가하면 'app2'가 반환됩니다. db 태그를 검색하면 처음에는 'db2', 2 등으로는 db3 등이 반환됩니다.

그래서 기본적으로 여기서 뭔가 잘못하고 있다고 확신합니다.

+0

여기에서 성취하고자하는 것은 분명하지 않습니다. 'db1', 'db2', 'db3'... 등의 순차 이름을 생성하려고합니까? 그런 다음 'app1'을 전달하면 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 일 수 있습니다.

관련 문제