web-dev-qa-db-ja.com

moment.jsの可変性を回避するにはどうすればよいですか?

モーメントオブジェクトの初期値を保存しなければならないという問題に遭遇しましたが、元のオブジェクトに合わせて変数が変化するのを防ぐのに苦労しています。

残念ながら、Object.freeze()は動作しません。moment.jsがフォーマットしようとすると「Invalid date」エラーを返すためです。

89
Shengbo1618

NPMには frozen-moment というMoment.jsプラグインがあります-moment().freeze()の代わりにObject.freeze(moment())を使用できます。

それ以外の場合、Vanilla Moment.jsには、可変性の問題を回避するのに役立つcloneメソッドがあります。したがって、次のようなことができます。

var a = moment(),
    b = a.clone(); // or moment(a)

UPDATE:

この答えを書いてから2年が経ちました。今回、日付を操作するための別のライブラリが登場し、多くの注目を集めました。 https://date-fns.org/

このライブラリはデフォルトでは不変であり、モジュール式の機能的アーキテクチャに従っています。つまり、ツリーの揺れやクライアント側のバンドルに適しています。クライアント側でWebpackを広範に使用するプロジェクトに取り組んでいて、Moment.jsがビルドに問題を引き起こしている場合、またはMoment.jsの可変性が頭痛の種になっている場合でも、 date-fnsを試してください。

149
razorbeard

これは古い質問であり、恥知らずな自己啓発に対する謝罪です。これは私の意図ではなく、誰かを助けることを願っています。

Razorbeardの言うこと(.clone()など)に加えて、Moment.jsに付属しているものに不変のメソッドをアタッチするNPMモジュールを作成しました。既存のコードを壊すことを意図していないため、モジュールは名前にImmuが追加された新しいメソッドを追加します。

モーメントファクトリによって返される各インスタンスは、不変のメソッドで装飾されます。たとえば、moment().startOf()には対応するstartOfImmu()があり、add()にはaddImmu()などがあります。既存のもの。使用するには、momentファクトリーをmomentImmutableMethodsに渡すだけで、新しい不変のメソッドにアクセスできます。例:

var moment = require('moment'); // or moment-timezone 
import { momentImmutableMethods } from 'moment-immutable-methods';

// to decorate instances with immutable methods we need to extend moment factory as below:
momentImmutableMethods(moment);

// now every instance returned by moment will have Immu methods attached.


// IMMUTABLE EXAMPLE
// we using immutable methods that were attached to every instance, these have Immu appended to original name
const ddd = moment({
  hour: 5,
  minute: 10
});
// Moment {_isAMomentObject: true, _i: {…}, _isUTC: false, _pf: {…}, _locale: Locale, …}
const eee = ddd.startOfImmu('day');
// Moment {_isAMomentObject: true, _i: {…}, _isUTC: false, _pf: {…}, _locale: Locale, …}
console.log(ddd === eee);
// false
const fff = eee.startOfImmu('month');
// Moment {_isAMomentObject: true, _i: {…}, _isUTC: false, _pf: {…}, _locale: Locale, …}
console.log(ddd === fff);
// false
console.log(eee === fff);
// false
console.log(ddd.format('DD/MM/YY HH:mma'));
// "14/04/18 05:10am"
console.log(eee.format('DD/MM/YY HH:mma'));
// "14/04/18 00:00am"
console.log(fff.format('DD/MM/YY HH:mma'));
// "08/04/18 00:00am"

NPMの https://www.npmjs.com/package/moment-immutable-methods

2
spirytus

より不変のコードが必要な場合は、パッケージ frozen-moment を使用することもできます。

0
morhook