2010-05-13 9 views
3

optionElements는 2 차원 배열입니다. 각 요소는 길이가 2 인 배열을가집니다. 정수와 요소입니다. 내가 linkbox라는 선택 목록을 가지고, 그리고 선택 목록에있는 모든 요소를 ​​추가하고 싶습니다. 내가 그들에게 들어가기를 원하는 순서는 중요하며, 각 원소의 수에 따라 결정됩니다. 그것은 가장 작은 것부터 가장 큰 것까지해야합니다.왜이 자바 스크립트 코드에는 무한 루프가 있습니까?

optionElements은 다음과 같습니다 :

[ [5, <option>], [3, <option], [4, <option], [1, <option], [2, <option]] 

을 그리고 그 숫자의 순서로 링크 상자에 추가 할 것입니다 그래서 이런 식으로 생각합니다. 그러나 그것은 어떻게되지 않습니다. 그것은 처음으로 무한 루프입니다. 브라우저를 고정시키지 않으려 고 x 제약 조건을 추가했지만 무시할 수 있습니다.

var b; 
var smallest; 
var samllestIndex; 
var x = 0; 
while(optionElements.length > 0 && ++x < 100) 
{ 
    smallestIndex = 0; 
    smallest = optionElements[0][0]; 
    b = 0; 
    while(++b < optionElements.length) 
    { 
     if(optionElements[b][0] > smallest) 
     { 
      smallestIndex = b; 
      smallest = optionElements[b][0]; 
     }      
    }      
    linkbox.appendChild(optionElements[smallestIndex][1]); 
    optionElements.unshift(optionElements[smallestIndex]); 
} 

누군가 내 문제를 지적 할 수 있습니까?

업데이트는이> 기호 while 루프에서 잘못된 그러나 문제의 원인이 아닌 추가하는 것을 잊었다.

답변

1

IE에서 .unshift()가 작동하지 않는다고 말할 수 있습니다. 이전에 IE를 사용했다면 Mozilla/Safari에서 테스트하고 싶을 것입니다.

+0

그리고 지금은, 생각하면 optionElements 배열에서 항목을 제거하는 것을 의미 할 것을 또는 원하는 효과를 얻기 위해 교대()를 사용할 수 있습니까? unshift()는 요소를 추가합니다. shift() 또는 pop()과 같은 것을 사용하고자 할 것입니다. – weiy

+0

이것은 내 생각으로도 배열에 추가하고 배열이 비어있을 때만 루프가 종료되는 조건이 있다고 생각합니다. 어쩌면 그 사람은 유배기가 팝처럼 끝에서 끝내기로 바뀔 것이라고 생각했을까요? – CodexArcanum

+0

아마도 그는 splice()를 찾고 있었을 것입니까? http://www.w3schools.com/jsref/jsref_splice.asp – Hasturkun

4

unshift는 전달하려는 배열을 호출하는 배열에 추가하기 때문에 무한 루프입니다. 따라서 외부 루프는 optionElements에 0보다 많은 항목이 있는지 확인한 다음 끝에는 커지기 때문에 루프가 종료되지 않습니다. http://www.w3schools.com/jsref/jsref_unshift.asp

어떤 이유로 든 왜 이렇게했는지 잘 모르겠습니다. optionElements 배열을 먼저 정렬 한 다음 한 번 반복하여 각 요소를 링크 상자에 추가해야하는 이유는 무엇입니까? javascript unshift() function에서

2

:

취소]() 메소드는 배열의 시작 새로운 요소를 추가하고, 새로운 길이를 반환한다.

즉, 요소를 제거하는 대신 처음부터 계속 추가하면 무한 루프가 발생합니다.

루프를 실행하려면 카운터를 사용하십시오. optionElements.length 시간이 더 좋습니다.

optionElements.shift(); 

: D

관련 문제