2016-07-31 10 views
0

上の関係を壊す私は開始時刻と終了時刻を持つオブジェクトのリストを持っている:壊しながらソート、終了時刻

let times = [ 
    {start: moment().add(1, 'days'), end: moment().add(2, 'days')}, 
    {start: moment().add(1, 'days'), end: moment().add(2, 'days')}, 
    {start: moment().add(4, 'days'), end: moment().add(5, 'days')}, 
    {start: moment().add(1, 'days'), end: moment().add(7, 'days')}, 
    {start: moment().add(2, 'days'), end: moment().add(3, 'days')}, 
] 

私は、開始時刻(最新の早い)によってこれらの時間をソートしたいです終了時刻との結びつき(短い終了時刻が最初に来る)。

だから、結果は次のようになります。

let sortedTimes = [ 
    {start: moment().add(1, 'days'), end: moment().add(2, 'days')}, 
    {start: moment().add(1, 'days'), end: moment().add(2, 'days')}, 
    {start: moment().add(1, 'days'), end: moment().add(7, 'days')}, 
    {start: moment().add(2, 'days'), end: moment().add(3, 'days')}, 
    {start: moment().add(4, 'days'), end: moment().add(5, 'days')}, 
] 

高階関数/最小限の構文でこれを行うために好適なJavascriptの方法はありますか?私はスクリプトを書くようになったが、ロジックには多くのif - else if - else構文が含まれており、より良い方法があるかどうか疑問に思っていた。再度、感謝します!

答えて

2

、私はあなたがmoment.jsを使用していると仮定しています。これは、より高次の機能を利用が、ちょうどカスタムコンパレータ機能でArray.prototype.sort方法を使用し、構文はかなり簡潔ではありません。

times.sort(function(a, b) { 
    return a.start.isBefore(b.start) ? -1 : a.start.isSame(b.start) ? a.end.isBefore(b.end) ? -1 : 1 : 1; 
}); 

アウト著:ここ

times.sort(function(a, b) { 
    if (a.start.isBefore(b.start)) { 
     return -1; // a before b 
    } else if (a.start.isSame(b.start)) { 
     // break tie on end 
     if (a.end.isBefore(b.end)) { 
      return -1; // a before b 
     } else { 
      return 1; // b before a 
     } 
    } else { 
     return 1; // b before a 
    } 
} 

があなたであればplunkrですそれを実際に見たいと思っています。

関連する問題