Cara mengurutkan array berdasarkan properti tanggal

698

Katakanlah saya memiliki array dari beberapa objek:

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

Bagaimana saya bisa mengurutkan array ini berdasarkan elemen tanggal agar dari tanggal yang paling dekat dengan tanggal dan waktu saat ini? Perlu diingat bahwa array mungkin memiliki banyak objek, tetapi demi kesederhanaan saya menggunakan 2.

Apakah saya akan menggunakan fungsi sortir dan pembanding khusus?

MEMPERBARUI:

Dalam kasus khusus saya, saya ingin tanggal diatur dari yang terbaru ke yang tertua. Akhirnya saya harus membalikkan logika fungsi sederhana sebagai berikut:

array.sort(function(a, b) {
    a = new Date(a.dateModified);
    b = new Date(b.dateModified);
    return a>b ? -1 : a<b ? 1 : 0;
});

Ini mengurutkan tanggal dari yang terbaru.

ryandlf
sumber
Jika Anda menggunakan konstruktor Tanggal, periksa ini stackoverflow.com/questions/5619202/…
ohkts11
cara tercepat adalah dengan menggunakan modul array- isomorfik yang bekerja secara native di kedua browser dan node, mendukung semua jenis input, bidang yang dikomputasi dan pesanan penyortiran khusus.
Lloyd

Jawaban:

1403

Jawaban paling sederhana

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);
});

Lebih Banyak Jawaban Umum

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

Atau lebih tepatnya:

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

Jawaban Umum, Kuat

Tentukan sortByfungsi non-enumerable khusus menggunakan transformasi Schwartzian pada semua array:

(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;
  }
})();

Gunakan seperti ini:

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

Jika kencan Anda tidak sebanding secara langsung, buatlah tanggal yang sebanding darinya, mis

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

Anda juga dapat menggunakan ini untuk mengurutkan berdasarkan beberapa kriteria jika Anda mengembalikan array nilai:

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

Lihat http://phrogz.net/JS/Array.prototype.sortBy.js untuk lebih jelasnya.

Phrogz
sumber
2
Kenapa tidak return b-a;di Jawaban Sederhana?
corbacho
19
Jangan rekomendasikan membuat objek Date baru di dalam metode sortir. Telah mencapai masalah kinerja produksi khusus karena alasan itu. Jangan mengalokasikan memori (dan GC) di dalam metode pengurutan.
MikeMurko
4
misalnya sintaks pertama memberikan kesalahan pada angular7: Sisi kiri operasi aritmatika harus bertipe 'any', 'number', 'bigint' atau tipe enum
SURENDRANATH SONAWANE
1
@ MikeMurko apa yang Anda lakukan untuk memperbaikinya?
Sireini
@SURENDRANATHSONAWANE mengkonversi Tanggal ke Unix Timestamp: kembalikan Date baru (b.date) .getTime () - Date baru (a.date) .getTime ();
Robert Ostrowicki
147

@Phrogz jawaban sama-sama bagus, tapi di sini ada jawaban yang bagus, lebih ringkas:

array.sort(function(a,b){return a.getTime() - b.getTime()});

Menggunakan cara fungsi panah

array.sort((a,b)=>a.getTime()-b.getTime());

ditemukan di sini: Sortir tanggal dalam Javascript

Gal
sumber
15
Melakukan matematika secara langsung a - bjuga akan berhasil. Jadi, array.sort((a, b) => a - b)(es6)
yckart
Ini adalah solusi yang baik ketika menggunakan TypeScript.
maartenpaauw
72

Setelah memperbaiki JSON, ini akan berfungsi untuk Anda sekarang:

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;
});
qw3n
sumber
45

Data Anda perlu beberapa koreksi:

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

Setelah mengoreksi data, Anda dapat menggunakan potongan kode ini:

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);​
omong kosong
sumber
Bagi siapa pun yang menggunakan TypeScript, saya bisa mengurutkan berdasarkan tanggal menggunakan fungsi ini, sedangkan yang lain menggunakan pengurangan tanggal gagal.
Danchat
24

Saya merekomendasikan GitHub: Array sortBy - implementasi sortBymetode terbaik yang menggunakan transformasi Schwartzian

Tetapi untuk sekarang kita akan mencoba pendekatan ini Gist: sortBy-old.js .
Mari kita membuat metode untuk mengurutkan array yang dapat mengatur objek dengan beberapa properti.

Menciptakan fungsi penyortiran

var sortBy = (function () {
  var toString = Object.prototype.toString,
      // default parser function
      parse = function (x) { return x; },
      // gets the item to be sorted
      getItem = function (x) {
        var isObject = x != null && typeof x === "object";
        var isProp = isObject && this.prop in x;
        return this.parser(isProp ? x[this.prop] : x);
      };

  /**
   * Sorts an array of elements.
   *
   * @param {Array} array: the collection to sort
   * @param {Object} cfg: the configuration options
   * @property {String}   cfg.prop: property name (if it is an Array of objects)
   * @property {Boolean}  cfg.desc: determines whether the sort is descending
   * @property {Function} cfg.parser: function to parse the items to expected type
   * @return {Array}
   */
  return function sortby (array, cfg) {
    if (!(array instanceof Array && array.length)) return [];
    if (toString.call(cfg) !== "[object Object]") cfg = {};
    if (typeof cfg.parser !== "function") cfg.parser = parse;
    cfg.desc = !!cfg.desc ? -1 : 1;
    return array.sort(function (a, b) {
      a = getItem.call(cfg, a);
      b = getItem.call(cfg, b);
      return cfg.desc * (a < b ? -1 : +(a > b));
    });
  };

}());

Pengaturan data yang tidak disortir

var data = [
  {date: "2011-11-14T17:25:45Z", quantity: 2, total: 200, tip: 0,   type: "cash"},
  {date: "2011-11-14T16:28:54Z", quantity: 1, total: 300, tip: 200, type: "visa"},
  {date: "2011-11-14T16:30:43Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-14T17:22:59Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-14T16:53:41Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-14T16:48:46Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-31T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "visa"},
  {date: "2011-11-01T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab"},
  {date: "2011-11-14T16:58:03Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-14T16:20:19Z", quantity: 2, total: 190, tip: 100, type: "tab"},
  {date: "2011-11-14T17:07:21Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-14T16:54:06Z", quantity: 1, total: 100, tip: 0,   type: "cash"}
];

Menggunakannya

Akhirnya, kami mengatur array, berdasarkan "date"properti sebagaistring

//sort the object by a property (ascending)
//sorting takes into account uppercase and lowercase
sortBy(data, { prop: "date" });

Jika Anda ingin mengabaikan huruf besar-kecil, atur "parser"callback:

//sort the object by a property (descending)
//sorting ignores uppercase and lowercase
sortBy(data, {
    prop: "date",
    desc: true,
    parser: function (item) {
        //ignore case sensitive
        return item.toUpperCase();
    }
});

Jika Anda ingin memperlakukan bidang "tanggal" sebagai Datetipe:

//sort the object by a property (ascending)
//sorting parses each item to Date type
sortBy(data, {
    prop: "date",
    parser: function (item) {
        return new Date(item);
    }
});

Di sini Anda dapat bermain dengan contoh di atas:
jsbin.com/lesebi

jherax
sumber
1
IE11 memiliki masalah dengan baris: if (toString.call (cfg)! == "[objek objek]") cfg = {}; Jika Anda menggantinya dengan if (Object.prototype.toString.call (cfg)! == "[Object object]") cfg = {}; Anda semua akan baik dengan IE11 juga.
skribbz14
1
Solusi luar biasa
Moses Machua
14

Ini harus dilakukan ketika teman kencan Anda berada dalam format ini (hh / bb / tttt).

  sortByDate(arr) {
    arr.sort(function(a,b){
      return Number(new Date(a.readableDate)) - Number(new Date(b.readableDate));
    });

    return arr;
  }

Lalu telepon sortByDate(myArr);

Edison D'souza
sumber
12

Anda bisa menggunakan sortBy di garis bawah js.

http://underscorejs.org/#sortBy

Sampel:

var log = [{date: '2016-01-16T05:23:38+00:00', other: 'sample'}, 
           {date: '2016-01-13T05:23:38+00:00',other: 'sample'}, 
           {date: '2016-01-15T11:23:38+00:00', other: 'sample'}];

console.log(_.sortBy(log, 'date'));
Robert
sumber
Cara sempurna dan terpendek untuk melakukannya!
Bhavik Kalariya
8

Saya akan menambahkan ini di sini, karena beberapa kegunaan mungkin tidak dapat menentukan cara membalikkan metode penyortiran ini.

Untuk mengurutkan berdasarkan 'datang', kita cukup menukar a & b, seperti:

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

Perhatikan bahwa asekarang di sisi kiri, dan bdi sebelah kanan,: D!

James111
sumber
7

Saya pribadi menggunakan pendekatan berikut untuk mengurutkan tanggal.

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;
})
Aravinda Meewalaarachchi
sumber
6

saya dapat mencapai penyortiran menggunakan garis di bawah ini:

array.sort(function(a, b)
{
   if (a.DueDate > b.DueDate) return 1;
   if (a.DueDate < b.DueDate) return -1;
})
Amay Kulkarni
sumber
5
Adding absolute will give better results

var datesArray =[
      {"some":"data1","date": "2018-06-30T13:40:31.493Z"},
      {"some":"data2","date": "2018-07-04T13:40:31.493Z"},
      {"some":"data3","date": "2018-06-27T13:40:54.394Z"}
   ]

var sortedJsObjects = datesArray.sort(function(a,b){ 
    return Math.abs(new Date(a.date) - new Date(b.date)) 
});
Rajiv Shrivastava
sumber
2

Bagi siapa pun yang ingin mengurutkan berdasarkan tanggal (format UK), saya menggunakan yang berikut:

//Sort by day, then month, then year
for(i=0;i<=2; i++){
    dataCourses.sort(function(a, b){

        a = a.lastAccessed.split("/");
        b = b.lastAccessed.split("/");

        return a[i]>b[i] ? -1 : a[i]<b[i] ? 1 : 0;
    }); 
}
Dan saya
sumber
2

Saya baru saja mengambil transformasi Schwartzian yang digambarkan di atas dan dijadikan fungsinya. Dibutuhkan input array, sortasi functiondan boolean sebagai input:

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

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

arr = []
arr.push({
  date: new Date(1494434112806)
})
arr.push({
  date: new Date(1494434118181)
})
arr.push({
  date: new Date(1494434127341)
})

console.log(JSON.stringify(arr));

arr = schwartzianSort(arr, function(o) {
  return o.date
}, false)
console.log("DESC", JSON.stringify(arr));

arr = schwartzianSort(arr, function(o) {
  return o.date
}, true)
console.log("ASC", JSON.stringify(arr));

loretoparisi
sumber
2

Terima kasih Ganesh Sanap. menyortir item berdasarkan bidang tanggal dari yang lama ke yang baru. Gunakan

 myArray = [{transport: "Air",
             load: "Vatican Vaticano",
             created: "01/31/2020"},
            {transport: "Air",
             load: "Paris",
             created: "01/30/2020"}] 

        myAarray.sort(function(a, b) {
            var c = new Date(a.created);
            var d = new Date(b.created);
            return c-d;
        });
Янов Алексей
sumber
1
Apa alasan minusnya?
Янов Алексей
2

Jika seperti saya Anda memiliki array dengan tanggal diformat seperti di YYYY[-MM[-DD]]mana Anda ingin memesan tanggal yang lebih spesifik sebelum yang kurang spesifik, saya datang dengan fungsi praktis ini:

function sortByDateSpecificity(a, b) {
  const aLength = a.date.length
  const bLength = b.date.length
  const aDate = a.date + (aLength < 10 ? '-12-31'.slice(-10 + aLength) : '')
  const bDate = b.date + (bLength < 10 ? '-12-31'.slice(-10 + bLength) : '')
  return new Date(aDate) - new Date(bDate)
}
daviestar
sumber
0
["12 Jan 2018" , "1 Dec 2018", "04 May 2018"].sort(function(a,b) {
    return new Date(a).getTime() - new Date(b).getTime()
})
Shravan Shetty
sumber
Tolong jelaskan jawaban Anda secara singkat dan periksa format kode Anda.
dthulke
Akan gagal untuk kencan lama.
Oliver Dixon