কিভাবে একটি তারিখের সম্পত্তি দ্বারা অ্যারে বাছাই করা যায়


698

বলুন আমার কাছে কয়েকটি বস্তুর একটি অ্যারে রয়েছে:

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

বর্তমান তারিখের নিকটতম তারিখ এবং সময়ের নিচে থেকে তারিখের উপাদান অনুসারে আমি এই অ্যারেটিকে কীভাবে সাজিয়ে তুলতে পারি? মনে রাখবেন অ্যারেতে অনেকগুলি অবজেক্ট থাকতে পারে তবে সরলতার জন্য আমি 2 ব্যবহার করেছি।

আমি কি বাছাই ফাংশন এবং একটি কাস্টম তুলক ব্যবহার করতে পারি?

হালনাগাদ:

আমার নির্দিষ্ট ক্ষেত্রে, আমি তারিখগুলি অতি সাম্প্রতিক থেকে প্রাচীনতম পর্যন্ত সজ্জিত চেয়েছিলাম wanted এটি শেষ হয়ে গেল যে আমাকে সাধারণ ফাংশনটির যুক্তিগুলি তাই উল্টাতে হয়েছিল:

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

এটি সাম্প্রতিকতম থেকে তারিখগুলি সাজায়।


আপনি যদি তারিখ
নির্মাতা

দ্রুততম উপায় হ'ল isomorphic সারণি -অ্যারে মডিউলটি যা ব্রাউজার এবং নোড উভয় ক্ষেত্রেই স্থানীয়ভাবে কাজ করে, যে কোনও ধরণের ইনপুট, গণিত ক্ষেত্র এবং কাস্টম সাজানোর আদেশকে সমর্থন করে।
লয়েড

উত্তর:


1400

সহজ উত্তর

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 দেখুন ।


2
কেন শুধু return b-a;সরল উত্তরে নয়?
করবাচো

19
সাজানোর পদ্ধতির অভ্যন্তরে নতুন তারিখ অবজেক্ট তৈরি করার পরামর্শ দিবেন না। বিশেষত সেই কারণেই উত্পাদনের পারফরম্যান্সের সমস্যাগুলিকে আঘাত করেছেন। কোনও বাছাই পদ্ধতিতে মেমরি (এবং জিসি) বরাদ্দ করবেন না।
মাইকমুরকো

4
প্রথম উদাহরণ বাক্য বিন্যাসটি কৌণিক 7 এ ত্রুটি দেয়: একটি গাণিতিক অপারেশনের বাম দিকে অবশ্যই 'যেকোন', 'সংখ্যা', 'বিগিন্ট' বা একটি
এনুম

1
@ মাইকমুরকো এটির সমাধান করতে আপনি কি করলেন?
সাইরেনি

@ সুরেন্দ্রনাথসোনওয়ান তারিখটিকে ইউনিক্স টাইমস্ট্যাম্পে রূপান্তর করুন: নতুন তারিখ (বি। ডেট) .টিটটাইম () - নতুন তারিখ (এডেট) .টিজেটটাইম () ফেরান;
রবার্ট অস্ট্রোইকি

147

@ ফ্রোগজ উত্তর দুটিই দুর্দান্ত তবে এখানে একটি দুর্দান্ত এবং আরও সংক্ষিপ্ত উত্তর দেওয়া হয়েছে:

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

তীর ফাংশন উপায় ব্যবহার

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

এখানে পাওয়া গেছে: জাভাস্ক্রিপ্টে বাছাই তারিখ


15
সরাসরি গণিত a - bকরাও কাজ করবে। সুতরাং, array.sort((a, b) => a - b)(এস))
ইয়র্কার্ট

টাইপস্ক্রিপ্ট ব্যবহার করার সময় এটি একটি ভাল সমাধান।
মার্টেনপাউউ

72

জেএসএন সংশোধন করার পরে এটি এখন আপনার পক্ষে কাজ করা উচিত:

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

45

আপনার ডেটা কিছু সংশোধন প্রয়োজন:

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


টাইপসক্রিপ্ট ব্যবহারকারী যে কোনও ব্যক্তির জন্য, আমি এই ফাংশনটি ব্যবহার করে তারিখ অনুসারে বাছাই করতে সক্ষম হয়েছি, অন্য তারিখ বিয়োগ ব্যবহার করে ব্যর্থ হয়েছে।
দানচাট

24

আমি গিটহাবের প্রস্তাব দিচ্ছি : অ্যারে সারণি বাই - শোয়ার্টজিয়ান ট্রান্সফর্মsortBy ব্যবহার করে এমন পদ্ধতির একটি সর্বোত্তম বাস্তবায়ন

তবে আপাতত আমরা এই পদ্ধতির চেষ্টা করতে যাচ্ছি জিস্ট: সাজ্টবাই-ওল্ড.জেএস
আসুন কিছু সম্পত্তি দ্বারা জিনিস সাজানোর জন্য সক্ষম অ্যারে সাজানোর জন্য একটি পদ্ধতি তৈরি করুন।

বাছাইয়ের ফাংশন তৈরি করা হচ্ছে

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

}());

অচলিত ডেটা সেট করা হচ্ছে

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"}
];

এটি ব্যবহার করছি

পরিশেষে, আমরা "date"হিসাবে সম্পত্তি হিসাবে অ্যারের ব্যবস্থাstring

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

আপনি যদি লেটার কেস উপেক্ষা করতে চান, "parser"কলব্যাক সেট করুন :

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

আপনি যদি "তারিখ" ক্ষেত্রটি Dateটাইপ হিসাবে আচরণ করতে চান :

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

এখানে আপনি উপরের উদাহরণটি দিয়ে খেলতে পারেন:
jsbin.com/lesebi


1
আইই ১১ এর লাইনটিতে একটি সমস্যা ছিল: যদি (toString.call (cfg)! == "[অবজেক্ট অবজেক্ট]") সিএফজি = {}; যদি আপনি এটির সাথে প্রতিস্থাপন করেন (Object.prototype.toString.call (cfg)! == "[অবজেক্ট অবজেক্ট]") সিএফজি = {}; আপনি IE11 এর সাথেও ভাল থাকবেন।
skribbz14

1
দুর্দান্ত সমাধান
মূসা মাচুয়া

14

আপনার তারিখটি এই ফর্ম্যাটে থাকলে (ডিডি / মিমি / ইয়াহী) এটি করা উচিত।

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

    return arr;
  }

তারপরে ফোন করুন sortByDate(myArr);


12

আপনি আন্ডারস্কোর জেএসে সারণবি ব্যবহার করতে পারেন।

http://underscorejs.org/#sortBy

নমুনা:

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

এটি করার নিখুঁত এবং সংক্ষিপ্ততম উপায়!
ভাভিক কালারিয়া

8

আমি এটি এখানে যুক্ত করতে যাচ্ছি, কারণ কিছু ব্যবহারগুলি এই শ্রেণিবদ্ধকরণ পদ্ধতিটি কীভাবে বিপরীত করা যায় তা নিয়ে কাজ করতে সক্ষম না হতে পারে।

'আসা' অনুসারে বাছাই করার জন্য, আমরা সহজেই একটি & বি অদলবদল করতে পারি:

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

লক্ষ্য করুন যে aএখন বাম দিকে, এবং bডানদিকে,: ডি!


7

তারিখগুলি বাছাই করার জন্য আমি ব্যক্তিগতভাবে নিম্নলিখিত পদ্ধতিটি ব্যবহার করি।

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

6

আমি নীচের লাইনগুলি ব্যবহার করে বাছাই করতে সক্ষম হয়েছি:

array.sort(function(a, b)
{
   if (a.DueDate > b.DueDate) return 1;
   if (a.DueDate < b.DueDate) return -1;
})

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

2

যে কেউ তারিখ অনুসারে বাছাই করতে চায় (ইউকে ফর্ম্যাট), আমি নিম্নলিখিতটি ব্যবহার করেছি:

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

2

আমি সবেমাত্র শোয়ার্তজিয়ান রূপান্তরটি উপরে চিত্রিত করেছি এবং ফাংশন হিসাবে তৈরি করেছি। এটি ইনপুট হিসাবে একটি array, বাছাই functionএবং একটি বুলিয়ান লাগে :

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


2

ধন্যবাদ গণেশ সনপ। পুরানো থেকে নতুন তারিখের ক্ষেত্র অনুসারে আইটেমগুলি বাছাই করা। এটা ব্যবহার করো

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

1
মাইনাসের কারণ কী?
Алексей

2

যদি আমার মত আপনার কাছে বিন্যাসিত তারিখগুলির সাথে একটি অ্যারে থাকে YYYY[-MM[-DD]]যেখানে আপনি কম নির্দিষ্ট নির্দিষ্ট তারিখগুলির আগে আরও নির্দিষ্ট তারিখগুলি অর্ডার করতে চান তবে আমি এই সহজ কাজটি নিয়ে এসেছি:

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

0
["12 Jan 2018" , "1 Dec 2018", "04 May 2018"].sort(function(a,b) {
    return new Date(a).getTime() - new Date(b).getTime()
})

দয়া করে সংক্ষিপ্তভাবে আপনার উত্তরটি ব্যাখ্যা করুন এবং আপনার কোডের ফর্ম্যাটটি পরীক্ষা করুন।
dthulke

পুরানো তারিখের জন্য ব্যর্থ হবে।
অলিভার ডিকসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.