Как мне работать с изменчивостью в moment.js?
У меня возникла проблема, когда я должен хранить начальные значения объекта-объекта, но у меня есть некоторые проблемы с тем, чтобы моя переменная не изменялась вместе с исходным объектом.
К сожалению, Object.freeze() не работает, потому что moment.js возвращает ошибку "Недействительная дата" при попытке форматировать это.
Ответы
Ответ 1
Там плагин Moment.js на NPM называется frozen-moment - Вместо Object.freeze(moment())
можно использовать moment().freeze()
.
В противном случае vanilla Moment.js имеет метод clone
, который должен помочь вам избежать проблем с изменением, поэтому вы можете сделать что-то вроде этого:
var a = moment(),
b = a.clone(); // or moment(a)
UPDATE:
Прошло два года с тех пор, как я написал этот ответ. В это время другая библиотека для работы с датами всплыла и приобрела большую тягу: https://date-fns.org/
Эта библиотека неизменна по умолчанию и соответствует модульной функциональной архитектуре, что означает, что она лучше подходит для древовидного вскакивания и связывания на стороне клиента. Если вы работаете над проектом, который широко использует Webpack на стороне клиента и обнаруживает, что Moment.js дает вам проблемы с вашей сборкой или даже если изменчивость Moment.js вызывает у вас много головной боли, тогда вы должен дать date-fns
попытку.
Ответ 2
Это старый вопрос и извинения за бесстыдное саморекламу, поскольку это не мое намерение, просто надеюсь, что это поможет кому-то.
В дополнение к тому, что говорит razorbeard (.clone()
и т.д.), я создал модуль NPM, который придает неизменные методы тому, что Moment.js поставляется с коробкой. Цель состоит в том, чтобы не нарушать существующий код, поэтому модуль добавляет новые методы с добавлением Immu
к его имени.
Каждый экземпляр, возвращаемый моментом factory, будет украшен неизменяемыми методами, например, moment().startOf()
будет иметь соответствующие startOfImmu()
, add()
будет иметь addImmu()
и т.д. Каждый из них возвращает новый момент, а затем модифицирует существующий. Чтобы использовать его, просто перейдите moment
factory в 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
Ответ 3
Вы также можете использовать пакет Frost-момент, если вам нравится более неизменный код.