2013-08-01 2 views
0
var _txtString = ":un:-:un:-:deux:-:deux:-:deux:-:trois:-:trois:" ; 
var _array = ["un", "deux", "trois"] ; 
var _items = new Array(); 

for (var t =0; t < _array.length; t++) { 
    found = _txtString.match(new RegExp(':' + _array[t]+ ':', 'g')); 
    _items[t] = parseInt(found.length); 
    //_items.sort(); 
    document.write("<br />" + _items[t] + " " + _array[t]); 
} 

안녕은, 가 제대로 계산이 코드를 실행할 때 표시되는 결과가됩니다sort() 함수가이 배열의 숫자 값을 변경하는 이유는 무엇입니까?

2 un 
3 deux 
2 trois 

하지만 종류의 주석을 해제 할 때() 라인은 카운트가 잘못 :

2 un 
3 deux 
3 trois <= 

내가 원하는 것은 숫자로 반환 된 결과를 정렬하는 것입니다. sort() 함수가 실제 값을 변경한다는 것을 이해해야합니다. 어떤 단서?

감사합니다.

답변

2

정렬 중이므로 배열 순서가 변경됩니다. 그래서 당신이 정렬 할 때 "3"이 마지막 색인이되고 그것을 써냅니다.

_items[t] = parseInt(found.length); //[2,3,2] 
_items.sort(); //[2,2,3] 
document.write("<br />" + _items[t] + " " + _array[t]); //here you are reading the last index which is 3 

개수로 정렬하려면 모든 것을 계산 한 후에해야합니다.

기본 아이디어 : 자바 스크립트

var _txtString = ":un:-:un:-:deux:-:deux:-:deux:-:trois:-:trois:"; 
var _array = ["un", "deux", "trois"]; 
var _items = new Array(); 

for (var t = 0; t < _array.length; t++) { 
    found = _txtString.match(new RegExp(':' + _array[t] + ':', 'g')); 
    _items.push({ 
     count: found.length, 
     text: _array[t] 
    }); 
} 

_items.sort(function (a, b) { 
    return a.count - b.count; 
}); 

for (var i = 0; i < _items.length; i++) { 
    console.log(_items[i].count, _items[i].text); 
} 
+0

감사합니다. 게시물에 대한 의견을 말씀드립니다. 정렬이 활성화 된 두 번째 줄에는 단순히 순서를 변경하는 것처럼 2,2,3이 아닙니다. 2,3,3입니다. 카운트는 다른 순서가 아니라 변경됩니다. 편집 :이 주석을 게시 할 때 업데이트를 보지 못했습니다. – Benj

+0

아니요, '2,2,3'입니다! console.log 행을 추가하고 그 내용을 확인하십시오. '_items [t] = parseInt (found.length); console.log ("before", _ items.join()); _items.sort(); console.log ("after", _ items.join()); ' – epascarello

+0

나는 푸시 메서드를 사용하여 값을 객체로 푸는 방법을 좋아합니다. 훨씬 더 청결한. Tks. – Benj

2

정렬 명령은 배열 순서를 변이 것입니다 의미에서 적절한 정렬을 수행합니다. 이 문제가 발생하면 코드가 예상 한 것과 동기화되지 않은 것처럼 보입니다.

배열 복사본을 만들고 원본 배열을있는 그대로 남겨두기 전에 복사본을 정렬하지 않는 한이를 피할 방법이 없습니다.

관련 문제