“[3,[4,5[6,7]]]” 이런 형태의 문자열이 있습니다. 이 문자열을 배열로 변환 하는 일을 하려고 합니다. 나름 문자열에 대한 이해는 있다고 생각 하고 바로 다음과 같은 함수를 하나 만들었습니다. 콤마 단위로 분리한후 문자열 처음에 ‘['이라면 새 배열을 만들 아니면 현재 배열에 넣고 하는 방식으로 만들었습니다. 쓰다보니 오류가 바로 나오네요. 동일레벨, 앞에 공백은 통과 못하겠네요. 왜 만들면서는 생각을 못했는지..
function parser( $str ){
var i, j, result, arr, temp;
arr = $str.split( ',' );
for( i = 0, j = arr.length ; i < j ; ++i ){
if( arr[i].indexOf( ‘[' ) === -1 ){
if( result[ result.length - 1 ] ){
result[ result.length ] = arr[i];
}else{
result[ result.length ][result[ result.length ].length] = arr[i];
}
}else{
if( result ){
temp = [];
temp[temp.length] = arr[i].replace( ‘[', '' );
result[ result.length ] = temp;
}else{
result = [];
result[ result.length ] = arr[i].replace( ‘[', '' );
}
}
}
return result;
}
배열로 반환하는데 성공 했습니다. 하지만 "[3,4,['[]‘,5],6]” 이런식의 문자열은 바른 배열로 반환하지 못합니다. 실제 값을 보고 기본을 무시하고 코딩한 결과입니다. 몇 시간동안 다른 케이스를 만들어 통과 시키고 하다가 결국 완성하지 못했습니다. 10번을 넘게 함수를 고쳐보기도 하고 다시 곰곰히 생각해봐도 결국 기본을 무시하면 해결이 안되더군요. ‘,’ 기준으로 분리하여 문자열의 처음값이 ‘['이면 배열을 선언하고 아니면 선언된 배열에 값을 넣는것은 틀리지 않았지만 동등 레벨일 경우, 문자열 값일때'[]‘ 에 대한 처리를 못한것이 였습니다. 하나의 문제를 해결하면 계속 해서 다른 문제가 나오고 해서 계속해서 if문이 늘어나고 아니다 싶어서 다시 …. 이 일이 반복…..
결국 해결하지 못하고 도움을 받았습니다. 기본적인 사용될 값에 대한 유효성 검사부터 시작해서, 세션 개념으로 처리된 코딩을 보고 나니 바로 해결할수 있었습니다.
function toArray( $str ){
var i, j, k, l, str, arr, prevArr, currArr, checkStr;
str = $str.substring( 1, $str.length - 1 );
arr = str.split( ',' );
prevArr = [];
currArr = [];
for( i = 0, j = arr.length ; i < j ; ++i ){
k = 0;
checkStr = trim( arr[i] );
if( checkStr ){
while( checkStr.charAt(0) === '[' ){
checkStr = checkStr.substr( 1 );
currArr[currArr.length] = [];
prevArr[prevArr.length] = currArr;
currArr = currArr[currArr.length - 1];
}
while( checkStr.substring( checkStr.length - 1 ) === ']' ){
checkStr = trim( checkStr.substr( 0, checkStr.length - 1 ) );
++k;
}
}
currArr[currArr.length] = checkStr;
for( l = 0 ; l < k ; ++l ){
if( prevArr.length ){
currArr = prevArr.pop();
}
}
}
return currArr;
}
코드에 대한 해석은 하지 않겠습니다. 자바스크립트로 코딩한것이긴 하지만 플래시로 테스트 하실수 있습니다. trim함수는 문자열의 앞뒤 공백을 제거하는 것입니다. 유효한 데이터인지 확인후 그 데이터를 가지고 알고리즘에 적용한다는 원칙은 잊지 말아야겠습니다.
VN:F [1.9.8_1114]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.8_1114]