2012-02-08 6 views
0

の要素をソートするために表示されます。jQueryのは、私はUIの要素のリストをソートしようとしているランダム

$('.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> 

ようになり、私は比較が真であるときtrueを返す、それが正しく比較をしているのを見ることができます。しかし、ソートを実行するUIでは、要素はランダムに表示されます。このコードを繰り返し実行すると、順序がランダム化され続けます。私は、data-attrsがすべて順不同であることを確認することで、デバッグコンソールでこれを確認できます。

ここで何が起こっているのかについてgoogには言及がありません。私は明日jQueryを深く掘り下げますが、私はこれをそこに投げ捨てると思っています。 jQuery 1.4.2(ええ..)ありがとう!

+0

はちょうど彼らがいない数値で、lexigraphicallyソートすることがあります注意してください。無作為化しても問題はないが、それでもなお問題はない。 –

+0

デイブが言ったように、あなたは数字ではなく文字列を比較しています。それらを整数にキャストするために '+'を前に置くことはできません。 – 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); 
関連する問題