配列内の日付の最小/最大?


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。コードはChrome、IE、FFでテストされています
Andrew D.

@RobG-「文字列日付」とはどういう意味ですか?
Andrew D.

例えばdates.push('2011/06/05')。文字列を使用すると、配列を簡単にソートでき、最初と最後のメンバー値が返され、必要に応じて日付に変換されます。
RobG 2011

10
@RobG-上記の質問では、配列には「日付文字列」ではなく日付オブジェクトが含まれています-日付オブジェクトに対する応答 「日付文字列」の使用は、場合によっては非常に悪い習慣です。次の2つの日付文字列「2011/06/05」と「2011/06/05 00:00:00」を比較します。1)文字列として:( "2011/06/05" === "2011/06/05 00:00:00"):結果はfalseです。2)Dateオブジェクトとして(数値に変換して):Number(new Date( "2011/06/05"))=== Number(new Date( "2011/06/05 00:00:00")):結果本当です-正しい結果です!
Andrew D.

@AndrewD。たとえば、dateStringsに一貫性YYYY/MM/DD HH:MM:SSがあり、多くの文字列が含まれている場合、文字列の比較またはNumber(new Date(dateString))比較を勧めますか?
BlackPanther 2016

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 devでテスト済み


Array.reduce()IE9より前のIEでは使用できません。でもクールなアイデア。
jfriend00

1
Array.reduceは()のJavaScript同等の機能を実装することができます
アンドリューD.

丁度、でそれについて読ん雄弁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; }
火災

1
IE <9は死ぬ可能性があり、実際、2013
。– wprl

3
reduceソリューションは、文字列とDatesオブジェクトに対して機能します。
ブノワ

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

配列の2番目の日付を返します(それが最も古いため)。


3
OPの質問に直接回答しません。OPは組み込みメソッドがJavaScriptで利用可能かどうかを尋ねています。したがって、_。min&_.maxは、最小または最大の日付を見つけるために使用できますが、OPが探しているものではありません。また、ユーティリティライブラリの検討は、根強いトピックです。
detj 2016年

13
私は敬意を払って同意せず、これは有用な回答だと思います、@ detj-現在述べられているOPの質問は、組み込み関数があるか、彼が独自に作成する必要があると想定していますが、これは真実ではありません。OPが提案するソリューションのいずれかの代替策としてユーティリティライブラリを指摘することは、私には理にかなっているようです。しかし、あなたの推論は防御可能であり、あなたの投票はあなた自身のものです。
Mark Amery 2016年

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)

(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 2018年

1
私は反対票を投じられました。Rudreshの答えは上記の私のものの複製です。なぜ人々はこれを好まないのか分かりません。これは、1行のコードと複数行のコードです。

3
これは日付ではなく数値を返すため、日付に変換し直す必要があります。それ以外はかなりエレガントです。
トマーシュHübelbauer

6

ONELINER

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

結果として変数minmax、複雑さO(nlogn)、編集可能な例はここにあります。配列に(のようなnull)日付のない値がある場合は、まずでそれを消去しdates=dates.filter(d=> d instanceof Date);ます。


2
var max_date = dates.sort(function(d1, d2){
    return d2-d1;
})[0];

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

私はここに単純なJavaScript デモを追加し、このコードペン でAngularJSのフィルターとして使用しました


0

これは、これを行うための特に優れた方法です(オブジェクトプロパティの1つを使用して、オブジェクトの配列の最大値を取得できます)。 Math.max.apply(Math,array.map(function(o){return o.y;}))

これは、このページで受け入れられている回答です。 オブジェクトの配列内の属性の最大値を見つける


-2

MomentUnderscorejQueryを使用して、日付の配列を反復処理します。

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.