ต่ำสุด / สูงสุดของวันที่ในอาร์เรย์?


107

ฉันจะหาค่าต่ำสุดและวันที่สูงสุดจากอาร์เรย์ของวันที่ได้อย่างไร ขณะนี้ฉันกำลังสร้างอาร์เรย์ดังนี้:

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

มีฟังก์ชันในตัวสำหรับทำสิ่งนี้หรือฉันจะเขียนเอง?

คำตอบ:


138

โค้ดได้รับการทดสอบกับ 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 โค้ดทดสอบใน Chrome, IE, FF
Andrew D.

@RobG - "วันที่สตริง" หมายความว่าอย่างไร
Andrew D.

เช่นdates.push('2011/06/05'). การใช้สตริงอาร์เรย์สามารถจัดเรียงได้อย่างง่ายดายและค่าสมาชิกตัวแรกและตัวสุดท้ายจะส่งกลับและแปลงเป็นวันที่หากจำเป็น
RobG

10
@RobG - ในคำถามด้านบนอาร์เรย์ประกอบด้วยวัตถุวันที่ไม่ใช่ "สตริงวันที่" - คำตอบสำหรับออบเจ็กต์ Date เช่นกัน การใช้ "สตริงวันที่" เป็นวิธีปฏิบัติที่ไม่ดีในบางกรณี เปรียบเทียบสตริงวันที่สองรายการถัดไป: "2011/06/05" และ "2011/06/05 00:00:00" 1) เป็นสตริง: ("2011/06/05" === "2011/06/05 00:00:00"): ผลลัพธ์เป็นเท็จ 2) เป็นอ็อบเจ็กต์ Date (พร้อมการแปลงเป็นตัวเลข): ​​Number (วันที่ใหม่ ("2011/06/05")) === Number (วันที่ใหม่ ("2011/06/05 00:00:00")): ผลลัพธ์ เป็นจริง - เป็นผลลัพธ์ที่ถูกต้อง!
Andrew D.

@AndrewD. หาก dateStrings สอดคล้องกันให้พูดYYYY/MM/DD HH:MM:SSและมีสตริงจำนวนมากที่เกี่ยวข้องคุณจะแนะนำการเปรียบเทียบสตริงหรือNumber(new Date(dateString))การเปรียบเทียบหรือไม่
BlackPanther

86

สิ่งที่ต้องการ:

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 dev


Array.reduce()ไม่มีใน IE ก่อน IE9 แม้ว่าไอเดียเจ๋ง ๆ
jfriend00

1
Array.reduce () สามารถใช้งานได้กับฟังก์ชันเทียบเท่ากับจาวาสคริปต์
Andrew D.

แน่นอนอ่านเกี่ยวกับเรื่องนี้ในEloquent Javascript :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; }
blaze

1
IE <9 สามารถตายได้และตอนนี้คิดเป็น 9.3% ของการใช้เบราว์เซอร์ทั่วโลก ณ เดือนเมษายน 2013 เท่านั้น
wprl

3
โซลูชันการลดใช้งานได้กับสตริงและสำหรับอ็อบเจ็กต์วันที่
Benoit

33

_.minและ_.maxทำงานกับอาร์เรย์ของวันที่ ใช้สิ่งเหล่านี้หากคุณใช้ Lodash หรือ Underscore และพิจารณาใช้ Lodash (ซึ่งมีฟังก์ชั่นยูทิลิตี้มากมายเช่นนี้) หากคุณยังไม่ได้ใช้

ตัวอย่างเช่น,

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

จะส่งคืนวันที่ที่สองในอาร์เรย์ (เนื่องจากเป็นวันที่เร็วที่สุด)


3
ไม่ตอบคำถามของ OP โดยตรง OP กำลังถามว่ามีวิธีการในตัวหรือไม่ใน JavaScript ดังนั้นแม้ว่าจะสามารถใช้ _.min & _.max เพื่อค้นหาวันที่ต่ำสุดหรือสูงสุด แต่ไม่ใช่สิ่งที่ OP กำลังมองหา นอกจากนี้การพิจารณาไลบรารียูทิลิตี้เป็นหัวข้อที่มีความคิดเห็น
detj

13
ฉันไม่เห็นด้วยอย่างยิ่งและคิดว่านี่เป็นคำตอบที่มีประโยชน์ @detj - คำถามของ OP ตามที่พูดในปัจจุบันสันนิษฐานว่ามีฟังก์ชันในตัวหรือเขาต้องเขียนของตัวเอง แต่นี่ไม่เป็นความจริง ดูเหมือนว่ามีเหตุผลสำหรับฉันที่จะชี้ให้เห็นไลบรารียูทิลิตี้เป็นทางเลือกหนึ่งของโซลูชันที่เสนอของ OP แต่เหตุผลของคุณสามารถป้องกันได้และการโหวตของคุณก็เป็นของคุณเอง
Mark Amery

16

เหมือนกับการสมัครตอนนี้ที่มีการแพร่กระจาย :

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

(อาจเป็นความคิดเห็นเกี่ยวกับคำตอบที่ดีที่สุด)


12

เนื่องจากวันที่ถูกแปลงเป็น UNIX epoch (ตัวเลข) คุณสามารถใช้ Math.max / min เพื่อค้นหา:

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

(ทดสอบใน Chrome เท่านั้น แต่ควรใช้ได้กับเบราว์เซอร์ส่วนใหญ่)


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

ที่จะให้วันที่ต่ำสุดจากอาร์เรย์

Math.min.apply ชวเลข (null, ArrayOfdates);


1
หากคุณลงคะแนนโปรดแสดงความคิดเห็น เหตุใดจึงเป็นตัวเลือกที่ไม่ดี ฉันชอบไวยากรณ์และสำหรับอาร์เรย์ขนาดเล็กการลงโทษด้านประสิทธิภาพมีความสำคัญเล็กน้อย
GijsjanB

1
ฉันถูกลดคะแนน คำตอบของ Rudresh ซ้ำกับของฉันด้านบน ไม่รู้ว่าทำไมคนถึงไม่ชอบสิ่งนี้ เป็นรหัสบรรทัดเดียวกับหลายบรรทัด

3
สิ่งนี้จะส่งคืนตัวเลขไม่ใช่วันที่ดังนั้นคุณต้องแปลงกลับเป็นวันที่ แต่ก็สวยสง่างามอย่างอื่น
TomášHübelbauer

6

ONELINER :

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

ส่งผลให้มีตัวแปรminและmaxซับซ้อนO (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 ในcodepen นี้


0

นี่เป็นวิธีที่ยอดเยี่ยมโดยเฉพาะอย่างยิ่งในการดำเนินการนี้ (คุณสามารถรับอาร์เรย์ของวัตถุได้สูงสุดโดยใช้คุณสมบัติวัตถุอย่างใดอย่างหนึ่ง): Math.max.apply(Math,array.map(function(o){return o.y;}))

นี่คือคำตอบที่ยอมรับสำหรับหน้านี้: การ ค้นหาค่าสูงสุดของแอตทริบิวต์ในอาร์เรย์ของวัตถุ


-2

ใช้Moment , Underscoreและ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"        
    }]

Javascript:

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

หวังว่าจะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.