1005

いくつかのオブジェクトの配列があるとします:

var array = [{id: 1, date: Mar 12 2012 10:00:00 AM}, {id: 2, date: Mar 8 2012 08:00:00 AM}];

この配列を日付要素で現在の日付と時刻に最も近い日付から順に並べ替えるにはどうすればよいですか? 配列には多くのオブジェクトが含まれる可能性があることに注意してください。ただし、単純にするために 2 を使用しました。

sort 関数とカスタム コンパレータを使用しますか?

4

22 に答える 22

1892

最も簡単な答え

array.sort(function(a,b){
  // Turn your strings into dates, and then subtract them
  // to get a value that is either negative, positive, or zero.
  return new Date(b.date) - new Date(a.date);
});

より一般的な回答

array.sort(function(o1,o2){
  if (sort_o1_before_o2)    return -1;
  else if(sort_o1_after_o2) return  1;
  else                      return  0;
});

またはもっと簡潔に:

array.sort(function(o1,o2){
  return sort_o1_before_o2 ? -1 : sort_o1_after_o2 ? 1 : 0;
});

一般的で強力な答え

すべての配列でシュワルツ変換を使用して、カスタムの列挙不可能なsortBy関数を定義します。

(function(){
  if (typeof Object.defineProperty === 'function'){
    try{Object.defineProperty(Array.prototype,'sortBy',{value:sb}); }catch(e){}
  }
  if (!Array.prototype.sortBy) Array.prototype.sortBy = sb;

  function sb(f){
    for (var i=this.length;i;){
      var o = this[--i];
      this[i] = [].concat(f.call(o,o,i),o);
    }
    this.sort(function(a,b){
      for (var i=0,len=a.length;i<len;++i){
        if (a[i]!=b[i]) return a[i]<b[i]?-1:1;
      }
      return 0;
    });
    for (var i=this.length;i;){
      this[--i]=this[i][this[i].length-1];
    }
    return this;
  }
})();

次のように使用します。

array.sortBy(function(o){ return o.date });

日付が直接比較できない場合は、比較可能な日付を作成します。

array.sortBy(function(o){ return new Date( o.date ) });

値の配列を返す場合、これを使用して複数の基準でソートすることもできます。

// Sort by date, then score (reversed), then name
array.sortBy(function(o){ return [ o.date, -o.score, o.name ] };

詳細については、 http://phrogz.net/JS/Array.prototype.sortBy.jsを参照してください。

于 2012-04-12T12:58:32.493 に答える
110

JSONを修正した後、これはあなたのために働くはずです:

var array = [{id: 1, date:'Mar 12 2012 10:00:00 AM'}, {id: 2, date:'Mar 8 2012 08:00:00 AM'}];


array.sort(function(a, b) {
    var c = new Date(a.date);
    var d = new Date(b.date);
    return c-d;
});
于 2012-04-12T13:06:04.337 に答える
62

データを修正する必要があります。

var array = [{id: 1, date: "Mar 12 2012 10:00:00 AM"},{id: 2, date: "Mar 28 2012 08:00:00 AM"}];

データを修正したら、次のコードを使用できます。

function sortFunction(a,b){  
    var dateA = new Date(a.date).getTime();
    var dateB = new Date(b.date).getTime();
    return dateA > dateB ? 1 : -1;  
}; 

var array = [{id: 1, date: "Mar 12 2012 10:00:00 AM"},{id: 2, date: "Mar 28 2012 08:00:00 AM"}];
array.sort(sortFunction);​
于 2012-04-12T13:08:54.077 に答える
16

上記の答えはすべて良いです。これはES6の方法で日付を並べ替える私の実装ですDate.parse。これは、日付の文字列表現をミリ秒数に変換する(グローバルDateオブジェクトです)を使用しています。new Date毎回オブジェクトをインスタンス化する代わりに。

var array = ["2021-08-10T07:24:30.087+0000" , "2021-09-30T07:24:30.087+0000", "2021-10-13T07:24:30.087+0000"];

// sorting with latest date
array.sort((a,b) => Date.parse(b) - Date.parse(a))
于 2021-10-28T12:47:16.920 に答える
9

一部の用途では、この並べ替え方法を逆にする方法が見つからない可能性があるため、ここに追加します。

次のように a と b を入れ替えるだけで、「来る」順に並べ替えることができます。

your_array.sort ( (a, b) => {
      return new Date(a.DateTime) - new Date(b.DateTime);
});

a現在は左側にあり、右側にあることに注意してくださいb:D!

于 2016-06-15T03:32:25.790 に答える
8

以下の行を使用してソートを実現できました:

array.sort(function(a, b)
{
   if (a.DueDate > b.DueDate) return 1;
   if (a.DueDate < b.DueDate) return -1;
})
于 2015-06-17T15:32:20.257 に答える
8

私は個人的に次のアプローチを使用して日付を並べ替えます。

let array = ["July 11, 1960", "February 1, 1974", "July 11, 1615", "October 18, 1851", "November 12, 1995"];

array.sort(function(date1, date2) {
   date1 = new Date(date1);
   date2 = new Date(date2);
   if (date1 > date2) return 1;
   if (date1 < date2) return -1;
})
于 2019-07-19T04:31:07.433 に答える