किसी सरणी में न्यूनतम / अधिकतम दिनांक?


106

मैं किसी दिनांक से न्यूनतम और अधिकतम दिनांक कैसे प्राप्त कर सकता हूं? वर्तमान में, मैं इस तरह से एक सरणी बना रहा हूं:

var dates = [];
dates.push(new Date("2011/06/25"))
dates.push(new Date("2011/06/26"))
dates.push(new Date("2011/06/27"))
dates.push(new Date("2011/06/28"))

क्या ऐसा करने के लिए कोई अंतर्निहित कार्य है या क्या मैं अपना स्वयं का लिखने के लिए हूं?

जवाबों:


137

कोड का परीक्षण IE, FF, Chrome के साथ किया जाता है और ठीक से काम करता है:

var dates=[];
dates.push(new Date("2011/06/25"))
dates.push(new Date("2011/06/26"))
dates.push(new Date("2011/06/27"))
dates.push(new Date("2011/06/28"))
var maxDate=new Date(Math.max.apply(null,dates));
var minDate=new Date(Math.min.apply(null,dates));

1
संख्या में रूपांतरण स्ट्रिंग '2011/06/25' के लिए नहीं, बल्कि नई तिथि ('2011/06/25') के लिए लागू किया गया। संख्या (नई तिथि ('2011/06/25') === 1308949200000। कोड क्रोम, IE, FF
एंड्रयू डी।

@RobG - "स्ट्रिंग डेट्स" से आपका क्या अभिप्राय है?
एंड्रयू डी।

उदा dates.push('2011/06/05')। तार का उपयोग करके सरणी को बस हल किया जा सकता है और यदि आवश्यक हो तो पहले और अंतिम सदस्य मान लौटाए गए और परिवर्तित किए गए।
रॉबग ऑग

10
@RobG - सरणी के ऊपर वाले प्रश्न में दिनांक ऑब्जेक्ट्स हैं, न कि "डेट स्ट्रिंग्स" - दिनांक ऑब्जेक्ट्स के लिए भी प्रतिक्रिया। कुछ मामलों में "डेट स्ट्रिंग्स" का उपयोग करना बहुत बुरा व्यवहार है। अगली दो तारीखों के तार की तुलना करें: "2011/06/05" और "2011/06/05 00:00:00"। 1) स्ट्रिंग्स के रूप में: ("2011/06/05" === "2011/06/05 00:00:00"): परिणाम गलत है; 2) दिनांक ऑब्जेक्ट के रूप में (संख्या में रूपांतरण के साथ): संख्या (नई तिथि ("2011/06/05")) === संख्या (नई तिथि ("2011/06/05 00:00:00")): परिणाम सच है - एक सही परिणाम है!
एंड्रयू डी।

@AndrewD। अगर डेटस्टार्स सुसंगत हैं, तो कहें YYYY/MM/DD HH:MM:SSऔर इसमें बहुत सारे तार शामिल हैं, क्या आप स्ट्रिंग तुलना या Number(new Date(dateString))तुलना की सलाह देंगे ?
BlackPanther

83

कुछ इस तरह:

var min = dates.reduce(function (a, b) { return a < b ? a : b; }); 
var max = dates.reduce(function (a, b) { return a > b ? a : b; });

Chrome 15.0.854.0 देव पर परीक्षण किया गया


Array.reduce()IE9 से पहले IE में उपलब्ध नहीं है। हालांकि अच्छा विचार है।
jfriend00

1
Array.reduce () जावास्क्रिप्ट समतुल्य समारोह के साथ लागू किया जा सकता है
एंड्रयू डी।

वास्तव में, इसके बारे में एलोकेंट जावास्क्रिप्ट में पढ़ें :function foreach(func, array) { for(var i = 0; i != array.length; ++i) { func(array[i]); } } function reduce(combine, base, array) { foreach(function(element) { base = combine(base, element); }, array); return base; }
धमाके से

1
IE <9 मर सकते हैं, और वास्तव में, यह अब अप्रैल 2013 के रूप में वैश्विक ब्राउज़र उपयोग के केवल 9.3% के लिए
जिम्मेदार है

3
कम समाधान स्ट्रिंग के लिए और डेट्स ऑब्जेक्ट के लिए काम करता है।
बेनोइट

33

_.minऔर _.maxतारीखों के सरणियों पर काम करना; यदि आप लॉडश या अंडरस्कोर का उपयोग कर रहे हैं, तो उन का उपयोग करें और यदि आप पहले से ही नहीं हैं तो लॉडश (जो इन जैसे कई उपयोगिता कार्य प्रदान करता है) का उपयोग करने पर विचार करें।

उदाहरण के लिए,

_.min([
    new Date('2015-05-08T00:07:19Z'),
    new Date('2015-04-08T00:07:19Z'),
    new Date('2015-06-08T00:07:19Z')
])

सरणी में दूसरी तारीख लौटाएगा (क्योंकि यह जल्द से जल्द है)।


3
सीधे ओपी के सवाल का जवाब नहीं देता। ओपी पूछ रहा है कि क्या एक अंतर्निहित विधि जावास्क्रिप्ट में उपलब्ध है। तो, हालांकि _.min और _.max का उपयोग न्यूनतम या अधिकतम तिथियों को खोजने के लिए किया जा सकता है, लेकिन ओपी की तलाश नहीं है। इसके अलावा, एक उपयोगिता पुस्तकालय का विचार एक विचारणीय विषय है।
detj

13
मैं सम्मानपूर्वक असहमत हूं और लगता है कि यह एक उपयोगी उत्तर है, @detj - ओपी का सवाल है कि वर्तमान में यह माना जाता है कि या तो कोई अंतर्निहित कार्य है या उसे अपना स्वयं का लिखना है, लेकिन यह सच नहीं है। यह ओपी के प्रस्तावित समाधानों के विकल्प के रूप में उपयोगिता पुस्तकालयों को इंगित करने के लिए मुझे उचित लगता है। लेकिन आपका तर्क रक्षात्मक है, और आपका वोट आपका अपना है।
मार्क अमेरी

16

समान रूप से लागू करें, अब प्रसार के साथ :

const maxDate = new Date(Math.max(...dates));

(सर्वोत्तम उत्तर पर टिप्पणी हो सकती है)


12

चूंकि तिथियां UNIX युग (संख्या) में बदल जाती हैं, आप उन्हें खोजने के लिए Math.max / min का उपयोग कर सकते हैं:

var maxDate = Math.max.apply(null, dates)
// convert back to date object
maxDate = new Date(maxDate)

(केवल क्रोम में परीक्षण किया गया है, लेकिन अधिकांश ब्राउज़रों में काम करना चाहिए)


8

** स्प्रेड ऑपरेटर्स का उपयोग करें | ES6 **

let datesVar = [ 2017-10-26T03:37:10.876Z,
  2017-10-27T03:37:10.876Z,
  2017-10-23T03:37:10.876Z,
  2015-10-23T03:37:10.876Z ]

Math.min(...datesVar);

वह एरे से न्यूनतम तारीख देगा।

इसका आशुलिपि गणित .min.apply (अशक्त, ArrayOfdates);


1
यदि आप नीचे दिए गए हैं, कृपया टिप्पणी करें। यह एक बुरा विकल्प क्यों है? मुझे सिंटैक्स पसंद है और छोटे सरणियों के लिए, प्रदर्शन दंड नगण्य है।
गिज्जनबी

1
मुझे नीचा दिखाया गया। रुद्रेश का जवाब मेरी एक डुप्लिकेट है। पता नहीं क्यों लोगों को यह पसंद नहीं है। यह कई लाइनों बनाम कोड की एक पंक्ति है।

3
यह एक नंबर देता है तारीख नहीं तो आपको इसे वापस तारीख में बदलना होगा। लेकिन यह बहुत सुंदर है अन्यथा।
टॉम हबलबॉयर

6

निर्माता :

var min= dates.sort((a,b)=>a-b)[0], max= dates.slice(-1)[0];

चर minऔर परिणाम max, जटिलता ओ (nlogn) , संपादन योग्य उदाहरण यहाँ । यदि आपके सरणी में कोई दिनांक-मान नहीं है (जैसे null) पहले इसे साफ़ करें dates=dates.filter(d=> d instanceof Date);



1

उपरोक्त उत्तर इसे ठीक करने के लिए रिक्त / अपरिभाषित मानों को नहीं संभालते हैं, मैंने नीचे दिए गए कोड का उपयोग किया और रिक्त स्थान को NA के साथ बदल दिया:

function getMax(dateArray, filler) {
      filler= filler?filler:"";
      if (!dateArray.length) {
        return filler;
      }
      var max = "";
      dateArray.forEach(function(date) {
        if (date) {
          var d = new Date(date);
          if (max && d.valueOf()>max.valueOf()) {
            max = d;
          } else if (!max) {
            max = d;
          }
        }
      });
      return max;
    };
console.log(getMax([],"NA"));
console.log(getMax(datesArray,"NA"));
console.log(getMax(datesArray));

function getMin(dateArray, filler) {
 filler = filler ? filler : "";
  if (!dateArray.length) {
    return filler;
  }
  var min = "";
  dateArray.forEach(function(date) {
    if (date) {
      var d = new Date(date);
      if (min && d.valueOf() < min.valueOf()) {
        min = d;
      } else if (!min) {
        min = d;
      }
    }
  });
  return min;
}

console.log(getMin([], "NA"));
console.log(getMin(datesArray, "NA"));
console.log(getMin(datesArray));

मैंने यहाँ एक सादे जावास्क्रिप्ट डेमो जोड़ा है और इसे इस कोडपेन में AngularJS के साथ एक फ़िल्टर के रूप में उपयोग किया है


0

ऐसा करने के लिए यह एक विशेष रूप से शानदार तरीका है (आप ऑब्जेक्ट गुणों में से किसी एक का उपयोग करके अधिकतम वस्तुओं को प्राप्त कर सकते हैं): Math.max.apply(Math,array.map(function(o){return o.y;}))

यह इस पृष्ठ के लिए स्वीकृत उत्तर है: वस्तुओं की एक सरणी में एक विशेषता का अधिकतम मूल्य ढूँढना


-2

क्षणों की एक सरणी को पुनरावृत्त करने के लिए मोमेंट , अंडरस्कोर और jQuery का उपयोग करना ।

नमूना JSON:

"workerList": [{        
        "shift_start_dttm": "13/06/2017 20:21",
        "shift_end_dttm": "13/06/2017 23:59"
    }, {
        "shift_start_dttm": "03/04/2018 00:00",
        "shift_end_dttm": "03/05/2018 00:00"        
    }]

जावास्क्रिप्ट:

function getMinStartDttm(workerList) {  
    if(!_.isEmpty(workerList)) {
        var startDtArr = [];
        $.each(d.workerList, function(index,value) {                
            startDtArr.push(moment(value.shift_start_dttm.trim(), 'DD/MM/YYYY HH:mm')); 
         });            
         var startDt = _.min(startDtArr);           
         return start.format('DD/MM/YYYY HH:mm');
    } else {
        return '';
    }   
}

आशा करता हूँ की ये काम करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.