2012-02-08 2 views
0

나는 UI 요소의 목록 정렬하려고 해요 요소를 정렬 나타납니다,jQuery를 무작위로

$('.stuff').sort(function(a,b) { 
    a = $(a).attr('data-date'); 
    b = $(b).attr('data-date'); 
    console.log(a + " > " + b); 
    console.log(a > b); 
    return a >= b; 
    }).appendTo('#stuff_container'); 

있는 HTML이

<div class='stuff' data-date='1278395142'>...</div> 
<div class='stuff' data-date='1378395142'>...</div> 

같은 내가 거기에 로그인 넣으면 모양을 I 비교가 사실 일 때 true를 반환하는 것이 올바르게 비교되고 있음을 알 수 있습니다. 그러나 UI에서 정렬을 실행할 때 요소가 임의로 나타납니다. 반복적으로이 코드를 실행하면 순서가 무작위로 유지됩니다. data-attrs가 모두 순서가 맞지 않다는 것을 알면 디버그 콘솔에서이를 확인할 수 있습니다.

Google에서 무슨 일이 벌어지고 있는지에 대한 어떤 언급도 찾을 수 없습니다. 내일 jQuery에 대해 더 깊이 들어가 겠지만, 이것을 밖으로 던질 것이라고 생각합니다. jQuery 1.4.2 (예 ..) 고마워!

+0

그냥 그렇지 않은 수치, lexigraphically 정렬 할 수 있습니다주의하십시오. 무작위로 분류한다면 문제는 아니지만 여전히 그렇습니다. –

+0

Dave가 말했듯이, 숫자가 아닌 문자열을 비교합니다. 당신은 정수 앞에'+'를 붙일 수 없다. – mowwwalker

+0

콘솔 출력과 DOM을 실행하면 도움이 될 것입니다 ... 아마도 jsfiddle에 올려 놓을 수 있을까요? –

답변

3

Array.prototype.sort으로 전달 된 콜백은 Number을 반환합니다. 시도 :

return Number(a) - Number(b); 
2

귀하의 정렬 기능 (번호 캐스팅 후) 0 또는 1을 반환합니다. 0 값은 sort에서 "값이 동일 함"에 해당합니다.

기본적으로 이는 54 값을 확인하면 5가 4보다 크고 이후에 수행해야 함을 의미합니다. 그러나 45을 확인하면 그 값이 같다고 알립니다. 이것은 모순이며 따라서 동작이 정의되지 않아 결과가 "임의"로 정렬됩니다.

이 시도 :

return a == b ? 0 : (a > b ? 1 : -1);