4

私はこれに困惑しています。Js で多くの並べ替えを実行しましたが、何らかの理由で奇妙な動作が発生しています。

x = [{ts: "2013-09-24 14:44:22"}, {ts: "2013-09-24 14:08:26"}, {ts: "2013-09-24 17:37:42"}].sort(function(a,b) {return a.ts < b.ts;});
console.log(x); // this is sorted

しかし、より長い配列を使用すると、並べ替えが機能しません。2 番目の並べ替えの最初の 3 つのオブジェクトを見てください。

http://jsfiddle.net/HWx7p/

何か案は?

4

5 に答える 5

1

それを日付としてソートします。それがあなたが望むものです:

y.sort(function(a,b) { 
   return new Date(a.ts) < new Date(b.ts);
});

分岐したフィドルhttp://jsfiddle.net/bHh4g/


フィドルで誤って削除されconsole.log(y);ましたが、再挿入すると、正しい並べ替えが表示されます。


ついに

FireFox / SafariDate()は " " 形式の日付を好まず、2013-09-24 14:44:22代わりに y/m/d が必要であることがわかりました。

y.sort(function(a,b) { 
    var d1 = a.ts.replace(/-/g,'/');
    var d2 = b.ts.replace(/-/g,'/');
    d1 = new Date(d1);
    d2 = new Date(d2);
    return (d1 < d2) ? -1 : (d1 > d2) ? 1 : 0;
});

console.log(y);

forked fiddle http://jsfiddle.net/Jnx4w/
は、Chrome / FF の両方で動作します。

于 2013-09-25T14:08:10.807 に答える
0

2つのこと:ソート関数はブール値ではなく符号付きの数値を返す必要があり、文字列ではなく日付を比較したいようです。

ソート機能については、次を試してください。

function(a,b){ return (new Date(a)).getTime() - (new Date(b)).getTime();}
于 2013-09-25T14:10:35.557 に答える