मैं क्षण-काल में परिवर्तनशीलता के आसपास कैसे काम कर सकता हूं?


106

मैं एक समस्या में भाग गया हूं, जहां मुझे एक पल की वस्तु के शुरुआती मूल्यों को संग्रहीत करना है लेकिन मुझे अपने चर को मूल वस्तु के साथ बदलने से रोकने में कुछ परेशानी हो रही है।

दुर्भाग्य से Object.freeze () काम नहीं करता है, क्योंकि जब मैं उस प्रारूप को बनाने की कोशिश करता हूं, तो क्षण "js" अमान्य दिनांक "त्रुटि देता है।


3
और कोड जैसा दिखता है…? आप प्रारंभिक मूल्य संग्रहीत करना चाहते हैं, तो समय मूल्य, का उपयोग कर उपलब्ध स्टोर valueOf विधि या संख्या के लिए अंतर्निहित रूपांतरण।
रॉबिन

एक बार जब आपका वैरिएबल सेट हो जाता है, तो यह सेट हो जाता है, यह स्वचालित रूप से नहीं बदलता है, इसलिए इसे बार-बार सेट न करें
जॉन स्मिथ

जवाबों:


184

एनपीएम पर एक मोमेंट.जेएस प्लगइन है जिसे फ्रोजन- मोमेंट कहा जाता है - आप इसके moment().freeze()स्थान पर उपयोग कर सकते हैं Object.freeze(moment())

अन्यथा, वेनिला मोमेंट.जेएस में एक cloneविधि है जिससे आपको उत्परिवर्तन समस्याओं से बचने में मदद करनी चाहिए, ताकि आप ऐसा कुछ कर सकें:

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

अपडेट करें:

मुझे यह जवाब लिखे दो साल हो चुके हैं। इस समय में, तारीखों के साथ काम करने के लिए एक और पुस्तकालय सामने आया है और बहुत अधिक कर्षण प्राप्त हुआ है: https://date-fns.org/

यह लाइब्रेरी डिफ़ॉल्ट रूप से अपरिवर्तनीय है और एक मॉड्यूलर, कार्यात्मक वास्तुकला का अनुसरण करती है, जिसका अर्थ है कि यह पेड़ के झटकों और क्लाइंट-साइड बंडलिंग के लिए बेहतर है। यदि आप एक ऐसे प्रोजेक्ट पर काम कर रहे हैं, जो क्लाइंट की तरफ से वेबपैक का व्यापक उपयोग करता है, और पाते हैं कि Moment.js आपको अपने निर्माण में परेशानी दे रहा है, या यहां तक ​​कि अगर Moment.js की उत्परिवर्तन से आपको बहुत अधिक सिरदर्द हो रहा है, तो आप date-fnsएक कोशिश देनी चाहिए ।


खैर, मैं full.Calendar प्लगइन में क्षणों का उपयोग कर रहा हूं और यह पता चलता है कि मैं अपने इवेंट के बाद की स्थिति से उस क्षण ऑब्जेक्ट डेटा प्राप्त कर रहा था जो मुझे चाहिए था। गतिरोध के मुद्दे निश्चित रूप से क्षण के साथ एक बात है। हालांकि, इस सुझाव के लिए बहुत बहुत धन्यवाद और खेद है कि मैंने आपका समय बर्बाद किया।
शेंग्बो 1618

24
आप momentइसे zz = moment(); zz.clone().add(3, 'h').toISOString();
परिवर्तित

5
ध्यान दें कि दिनांक-एफएनएस में बहुत खराब टाइमज़ोन समर्थन है और यूटीसी तिथियों के लिए कोई समर्थन नहीं है।
माजूपरई

3
मैं date-fnsथोड़ी देर के लिए उपयोग कर रहा हूं, लेकिन जब से मोमेंट और लड़के का उपयोग करके विरासत कोड में कूदना पड़ा है, क्या इस पोस्ट ने मुझे खिड़की से बाहर कूदने से बचाया।
9

dayjsयह एक अच्छा विकल्प भी है क्योंकि इसमें APIs क्षण के समान है। अपरिवर्तनीय प्रकृति के साथ। (मार्च 2019 तक, इसमें टाइमज़ोन समर्थन का अभाव है, लेकिन यह काफी नया पुस्तकालय है और मैं देख सकता हूं कि काम जारी है।)
टोमोयुकी आटा

2

यह एक पुराना सवाल है और बेशर्म आत्म पदोन्नति के लिए माफी माँगता हूँ क्योंकि यह मेरा उद्देश्य नहीं है, बस उम्मीद है कि यह किसी की मदद करेगा।

Razorbeard क्या कहता है ( .clone()आदि) के अलावा, मैंने 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"

एनपीएम पर इसकी https://www.npmjs.com/package/moment-immutable-methods पर

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.