paint-brush
जावास्क्रिप्ट में आसान तरीके से समय अंतराल जोड़ेंद्वारा@anwarhjg
740 रीडिंग
740 रीडिंग

जावास्क्रिप्ट में आसान तरीके से समय अंतराल जोड़ें

द्वारा AHJ George4m2024/01/13
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

आपके पास एक टाइमशीट स्ट्रिंग, एक होवरिंग बॉस और जावास्क्रिप्ट है। समस्या: आप घंटों को एक साथ जोड़ना चाहते हैं और अपने बॉस को मंडराने से रोकना चाहते हैं। समाधान: जादू टोना की आवश्यकता नहीं है.
featured image - जावास्क्रिप्ट में आसान तरीके से समय अंतराल जोड़ें
AHJ George HackerNoon profile picture
0-item

इस ट्यूटोरियल को पूरा करने के लिए आपको इनमें से किसी भी जादुई सामान की आवश्यकता नहीं होगी। लेखक द्वारा छवि.



हुउउफ़. एक ठंडी जकड़न आपकी रीढ़ की हड्डी तक अपना रास्ता बना लेती है।


हाआआआह. आपके बॉस की ठंडी सांसें उफनते सीवर की तरह आपकी गर्दन पर बहती हैं। लेकिन आप उन्हें कहीं और मंडराने के लिए नहीं कह सकते... जब से कार्यालय का समय-ट्रैकिंग सिस्टम टूटा है तब से वे आपको बाज़ की तरह देख रहे हैं।


अब, वे वहीं हैं...मँडरा रहे हैं...साँस ले रहे हैं। हफ़्फ़्फ़्फ़।


आपने अपने घंटों को टाइमशीट पर लिखने का प्रयास किया, लेकिन आपका बॉस इस सारी प्रक्रिया में काफी व्यस्त है। यदि उन्होंने गणित सही से नहीं किया और आपके घंटे गलत जोड़ दिए तो क्या होगा?


यहां बताया गया है कि जावास्क्रिप्ट के साथ मामलों को अपने हाथों में कैसे लिया जाए। हाआआ .

समस्या

आपके पास एक टाइमशीट है जो इस String की सामग्री की तरह दिखती है:

 const a = `November 30 2023 13:20-15:00, 15:30-16:40 December 4 2023 15:45-16:15, December 5 2023 08:00-08:30, 18:15-19:30, 21:45-22:15, 22:30-23:00 December 6 2023 19:45-21:45 December 7 2023 14:15-14:45, 15:15-15:45, 16:00-16:30, 16:45-17:15, 18:45-20:15, 20:45-22:45 December 13 2023 03:00-03:50 December 15 2023 09:00-09:30 20:30-21:15 21:45-22:30 23:30-24:00 December 16 2023 23:25-23:55 December 17 2023 19:05-19:50 20:30-21:30 22:15-23:45 December 20 2023 23:30-24:00 December 21 2023 02:20-2:50 03:15-03:30 13:40-14:00 16:00-17:15 17:45-18:45 19:20-20:10 21:30-22:20 23:00 - 24:00 December 22 2023 0:00-0:15`;


प्रत्येक पंक्ति में एक तारीख और उसके बाद कुछ समय अंतराल होते हैं। लेकिन वे बहुत साफ-सुथरे ढंग से नहीं लिखे गए हैं - कुछ अंतराल अल्पविराम से अलग किए गए हैं, अन्य में अनियमित रिक्ति है, आदि।


इन विसंगतियों को देखते हुए, कोई अन्य गारंटी न मानना संभवतः अच्छा होगा। उदाहरण के लिए, कौन कहता है कि सभी समय एक ही वर्ष के होंगे? कोई नहीं, वह कौन है। आप घंटों को यथासंभव मजबूती से जोड़ना चाहते हैं।

समाधान

यह बहुत आसान है. हम कुछ रेगुलर एक्सप्रेशन और एक सहायक फ़ंक्शन बनाकर शुरुआत करते हैं। फिर, हम बस... हुउउउउफ़्फ़!


ऊँ!! बॉस, एक सेकंड के लिए कहीं शांत हो जाइए!


जैसा कि मैं कह रहा था, अब हम तीन-चरणीय एल्गोरिदम के साथ कार्य पूरा कर सकते हैं:


  1. हम टाइमशीट स्ट्रिंग को अलग-अलग पंक्तियों में विभाजित करते हैं और ऑब्जेक्ट की एक सरणी बनाने के लिए उन्हें कम करते हैं


  2. प्रत्येक पुनरावृत्ति के लिए, हम:

    A. दिनांक स्ट्रिंग को रिकॉर्ड करते हुए, yearRegex उपयोग करके वर्ष के चारों ओर लाइन को विभाजित करें

    बी. intervalsRegex उपयोग करके सभी समय सीमा अंतरालों को एकत्रित करें

    सी. चरण 2.ए से parseDate सहायक और दिनांक स्ट्रिंग का उपयोग करके प्रत्येक को जावास्क्रिप्ट दिनांक ऑब्जेक्ट के रूप में पार्स करते हुए, समय सीमा को कम करें।


  3. कुल घंटे ज्ञात करने के लिए वस्तुओं की श्रृंखला को कम करें


 const yearRegex = /(\d{4})/gi; const intervalsRegex = /(\d+\:\d+)\s*-\s*(\d+\:\d+)/gi; const parseDate = (date, time) => Date.parse(`${date} ${time}`); let times = [...a.split("\n")].reduce((arr, entryLine) => { let entryLineSplit = entryLine.split(yearRegex); let o = { date: entryLineSplit[0] + entryLineSplit[1], timeRanges: [...entryLine.matchAll(intervalsRegex)], }; o.hoursForDay = o.timeRanges.reduce((total, [x, start, end]) => { let s = parseDate(o.date, start); let e = parseDate(o.date, end); return total + (e - s) / 1000 / 60 / 60; }, 0); return [...arr, o]; }, []); console.log(times); let totalHours = times.reduce((total, { hoursForDay }) => total + hoursForDay, 0); console.log(totalHours);


यदि आप console.log(times); कथन, आपको एक सरणी दिखाई देगी जिसमें ऑब्जेक्ट होंगे जैसे:

 { date: 'November 30 2023', timeRanges: [ [ '13:20-15:00', '13:20', '15:00', index: 17, input: 'November 30 2023 13:20-15:00, 15:30-16:40', groups: undefined ], [ '15:30-16:40', '15:30', '16:40', index: 30, input: 'November 30 2023 13:20-15:00, 15:30-16:40', groups: undefined ] ], totalHours: 2.8333333333333335 },

इस विधि के लाभ

केवल समय अंतराल निकालने और उन्हें जोड़ने की तुलना में वस्तुओं की एक श्रृंखला बनाने के कुछ विशिष्ट फायदे हैं।


  • यह तथ्य के बाद आसान ट्रैवर्सल बनाता है। यदि आप अपने दैनिक समय का ग्राफ़ जैसा कुछ करना चाहते हैं तो यह आदर्श है।


  • प्रत्येक रिकॉर्ड के लिए दिनांक स्ट्रिंग को सहेजने से Date.parse पर कॉल के बाद अंतर्निहित JS दिनांक अंकगणितीय विधियों के उपयोग की अनुमति मिलती है।


  • ऑब्जेक्ट String.prototype.split कॉल करने के परिणामों को संग्रहीत करने के लिए एक सुविधाजनक स्थान है, जो इस बात पर निर्भर नहीं हो सकता है कि दो दिनों में समान समय अंतराल शामिल है या नहीं।

इस विधि के नुकसान

यह समाधान सही नहीं है:

  • इसके लिए दो बड़े ट्रैवर्सल की आवश्यकता होती है - एक बार टाइमशीट को विभाजित करने के परिणाम पर, और फिर एक बार times ऑब्जेक्ट पर। इस कोड को अनुकूलित करने के लिए, फ़ील्ड के रूप में totalHours और times वाले खाली ऑब्जेक्ट पर सिंगल रिड्यूस का उपयोग करना बेहतर होगा।


  • यह नियमित अभिव्यक्ति का उपयोग करता है जो अधिक जटिल प्रारूप के साथ और अधिक जटिल हो सकता है

ऊपर लपेटकर

अब आप जानते हैं कि अस्त-व्यस्त टाइमशीट से समय कैसे निकाला जाता है। थोड़े अतिरिक्त प्रयास से, आप एक पूर्ण समय वाली घड़ी भी बना सकते हैं। लेकिन तब आपको अपने बॉस को जानने के लिए इतना अच्छा गुणवत्तापूर्ण समय बिताने का मौका नहीं मिलेगा, क्या आप ऐसा करेंगे? हफ़्फ़।