2012-01-29 9 views
0

때때로 배열 내의 두 문자열을 비교하는 데 실패합니다. 루프는 if의 루프에서만 가끔씩 오류가 발생합니다. 아래의 예제 코드는 문제를 구현하기위한 것입니다. searchTable에서배열의 값 비교가 실패합니다.

searchTable.sort(); 
for(n=1;n<searchTable.length;n++){ 
    // alert(searchTable[n-1]!=searchTable[n]); 
    if(searchTable[n-1]!=searchTable[n]){ 
    idx++; 
    memTable[idx]=searchTable[n]; 
    } 
} 

값은 확실히 strings 있으며, 모든 값 중 하나와 유사하지 않다.

루프에서 모든 값은 [n-1][n]의 비슷한 값 임에도 불구하고 memTable [idx]에 설정됩니다. 활성화 된 alert()은 올바른 비교 결과를 나타내지 만 if이 모두 통과합니다. if의 비교는 가치가 아니라 기준으로 수행됩니다. 이것이 어떻게 가능한지? 자바 스크립트 인터프리터의 버그인가요?

비교 표현에서 두 멤버에 valueOf() -methods를 추가하여 해결할 수 있습니다. 나는이 실패한 whithin을 if으로 만 돌파했습니다. 때때로 코드가 작동하지 않는 이유를 파악하는 데 오랜 시간이 걸릴 수 있습니다.

+0

1) 문제의 jsfiddle을 보여 숫자 및 문자열 구분하지 않습니다. 2) alertType [n] searchTable - 아마도 객체가 아닌 문자열입니다. – mplungjan

답변

0

문제가 배열의 실제 데이터와 관련되어있는 것 같습니다. 나는 우리가 그 데이터가 무엇인지 보지 않고 더 구체적으로 도울 수 없다고 생각한다.

앞에 valueOf() 퍼팅 작동하게되면, 당신은 valueOf()과의 비교가 단지 바로 != 및 출력 디버그 콘솔에 두 개의 값을 다른 경우에 대한 수표를 코딩 할 수 있습니다 또는 검사 할 수 있도록 디버거에 침입 무엇 값이 문제의 원인입니다. 즉, 문제 조건을 포착하고이를 검사 할 수있는 코드를 작성하십시오.

+0

Thanks @ jfriend00. 원래의 코드에서'searchTable'에 대한 값은 텍스트 파일에서'FileSystemObject'에 의해 읽혀졌습니다. 그들은 확실히 문자열입니다. 나는 디버거에서 이것을 시도 할 것이고 hta를 htm으로 변환해야한다고 생각한다. – Teemu

0

배열에서 double 값을 제거하려는 것처럼 보입니다. 사용해보십시오 :

var tmpObj = {}, resultArr = []; 
for(n=1;n<searchTable.length;n++){ 
    if (searchTable[n] in tmpObj){ 
    continue; 
    } 
    tmpObj[searchTable[n]] = true; 
} 
for (var l in tmpObj){ 
resultArr.push(l); 
} 

참고 :이 (그래서 1 등호 '1')