2

JavaScriptには2つの日付がstartあり、 Moment.jsfinishによって解析されます。3番目の日付を作成せずに後の場合、それらを交換する最も効率的な方法は何でしょうか?通常、日付は次のような関数のパラメーターになります。startfinish

function getDates(start, finish) {
  var start_date = moment(new Date(start));
  var finish_date = moment(new Date(finish));
  if (start_date.diff(finish_date) > 0) {
    // Swap code goes here...
  }
}

日付を入れ替えたい理由は、日付を入れ替えても同じ結果が返されるように関数が定義されているにもかかわらず、関数はどちらの日付が早いかを知る必要があるためです。たとえば、MicrosoftExcelのYEARFRACはそのように機能します。最適ではない日付スワッピングの例については、ここでその関数の私の実装を見ることができます。

よろしくお願いします!

4

3 に答える 3

2

開始が終了の後である場合、それらを交換する最も効率的な方法は何でしょうか

3番目の変数を使用します。楽しみのために、破壊的な割り当てを使用して、構文的にその周りで機能するのを防ぐことができますが、これによってパフォーマンスに違いが生じることはほとんどありません。

3番目の日付を作成する必要はありませんか?

それが変数を使うポイントです。前述の二項演算子の方法では、Dateオブジェクトを整数にキャストし、演算を適用してから、整数から2つの新しいDateオブジェクトを作成する必要があります。

于 2013-01-21T02:29:35.103 に答える
1

追加の日付を持つことに対するあなたの制約が別の変数をまったく持たないと解釈されるべきであるなら、私はインライン変数スワッピングのためのこの人の素晴らしいアイデアに基づいた解決策を持っています:

function getDates(start, finish) {
    var start_date = new Date(2013, 0, 5);
    var finish_date = new Date(2013, 0, 4);
    start_date = start_date.getTime();
    finish_date = finish_date.getTime();
    start_date = -(finish_date = (start_date += finish_date) - finish_date) + start_date;
    start_date = new Date(start_date);
    finish_date = new Date(finish_date);
    alert(start_date);
    alert(finish_date);
}
于 2013-01-21T02:29:46.400 に答える
0

必要なものを理解したかどうかはわかりませんが、タイムスタンプをstartfinishに渡すと、次のようになります。

start_date = start > finish ? finish : start;
finish_date = start > finish ? start : finish;

3番目の一時変数なしで値を交換します。次に、モーメントオブジェクトを作成し、それらを操作できます。例えば:

function dateDiff( start, finish, measure ){
  var start_date = start > finish ? finish : start, 
      finish_date = start > finish ? start : finish;
  return moment(finish_date).diff(moment(start_date), measure);
}

dateDiff( new Date(2013,1,21), new Date(2013,1,28), 'days' ) // 7
dateDiff( new Date(2013,1,28), new Date(2013,1,21), 'days' ) // 7

正の違いを知るだけでよい場合は、次のこともできます。

date_diff = (start < finish ? finish : start) - (start < finish ? start : finish);

編集:

ただし、三項演算子を使用しても、パフォーマンスが従来のステートメントよりも低いことをテストすることは可能です。if..else

これがお役に立てば幸いです。

于 2013-01-21T02:49:44.090 に答える