שליפת שעה קודמת ומאוחרת של הממצא המבוקש ממערך שעות
-
יש לי מערך של שעות כזה
['18:15:00', '19:00:00', '19:45:00', '20:15:00', '21:30:00']
ולפעמים הוא גם יכול להגיע ללא השניות כך:
['18:15', '19:00', '19:45', '20:15', '21:30']
אני אמור לקבל מהמשתמש קלט כזה
1830
וברצוני לתת לו את התוצאה המדוייקת אם קיים במערך שעה נכונה למבוקשו, אחרת אני רוצה לתת לו את השעה הקודמת והשעה המאוחרת ושהוא יוכל לבחור מה הוא רוצה מביניהם
הנ"ל בnodejs
אשמח לרעיון איך ניתן לחפש את זה.
תודה -
@חוקר אני הייתי מציע,
א) לעשות נרמול לערכים שבמערך, דהיינו להוריד את השניות על ידי חיפוש והחלפה של רג'קס,
ב) להוריד את הנקודתיים מהמחורוזות ואז לתרגם אותם למספרים
ג) למיין אותם לפי סדר עולהאו יורד(אם הם לא ממויינים כבר)
ד) לחפש את המספר הקרוב ביותר שמעל או שווה למספר שהמשתמש הזין
ה) אם המספר שווה להחזיר אותו, אם לא אז להחזיר אותו ואת המספר שלפניו -
קוד לדוגמה:
let availableTimes = ['18:15:00', '19:00:00', '19:45:00', '20:15:00', '21:30:00']; const givenTime = 1830; function findTime (availableTimes, givenTime) { const normalizedTimes = availableTimes.map(time => { return parseInt(time.split(':').splice(0, 2).join('')); }).sort((a, b) => a - b); const nearestIndex = normalizedTimes.findIndex(time => time >= givenTime); if (nearestIndex === -1) return normalizedTimes[normalizedTimes.length - 1]; else if (normalizedTimes[nearestIndex] === givenTime) return givenTime; else return [normalizedTimes[nearestIndex - 1], normalizedTimes[nearestIndex]]; } console.log(findTime(availableTimes, givenTime));
-
@חוקר אמר בשליפת שעה קודמת ומאוחרת של הממצא המבוקש ממערך שעות:
איך אני מוריד את השניות בלי להתקע עם הורדת הדקות
בסוף לא עישתי רג'קס כי אני עצל מדי ומה שעשיתי הגיע אלי יותר קל... אבל אפשר בהחלט גם רג'קס:
"12:45:00".replace(/(^.{5}).*$/, '$1')
-
@yossiz אמר בשליפת שעה קודמת ומאוחרת של הממצא המבוקש ממערך שעות:
עוד מעט תעשה טסט וזה לא יעבוד או ש@dovid יגיע ויוכיח איך כתבתי נח עם 7 טעויות... אז מוקדם מדי לצחוק
ראשית נראה שזה עובד.
שנית לאחר תחילת העיון נהנתי מהרעיוןtime.split(':').splice(0, 2).join('')
פשוט מאוד גם בשביל ההסרה וגם לא להתקע עם הורדת הדקות.
יפה מאוד! -
לאחר כמה התאמות כדי לדעת האם זה הקודם או הבא, זה הקוד המלא.
let availableTimes = ['18:15:00', '19:00:00', '19:45:00', '20:15:00', '21:30:00']; const givenTime = '1830'; function findTimeFromRange (availableTimes, givenTime) { givenTime = parseInt(givenTime); if (givenTime < 1200){givenTime += 1200} const normalizedTimes = availableTimes.map(time => { return parseInt(time.split(':').splice(0, 2).join('')); }).sort((a, b) => a - b); if (givenTime < normalizedTimes[0]){ return {'next' : normalizedTimes[0]}; }else if (givenTime > normalizedTimes[normalizedTimes.length - 1]){ return {'previous' : normalizedTimes[normalizedTimes.length - 1]}; } const nearestIndex = normalizedTimes.findIndex(time => time >= givenTime); if (normalizedTimes[nearestIndex] === -1) return {'previous' : normalizedTimes[normalizedTimes.length - 1]}; else if (normalizedTimes[nearestIndex] === givenTime) return {'this' : givenTime}; else return {'next' : normalizedTimes[nearestIndex - 1], 'previous' : normalizedTimes[nearestIndex]}; } console.log(givenTime, findTimeFromRange(availableTimes, givenTime));
רק משהוא אחד לא ברור לי מה התכוון המשורר, מתי שורה מספר 16 רלוונטית? כי אם המספר המבוקש הוא מוקדם המספר הראשון במערך כבר התייחסת לזה בשורה 13, א"כ שורה 16 מיותרת? או שפספסתי משהו?
-
@חוקר אחרי שהוספת את הקוד שלך אכן זו קושיא...
הקוד שלך היינו שורות 10-14 הם בדיוק הדרך בה הייתי כותב,
אלא ש@yossiz בגאונות אופיינית כתב בתנאי אחד את כל האפשרויות, ולכן המקטע הזה מיותר וכפול.
אני לא מבין בדיוק למה אחרי שקיבלת את הקוד היית צריך לשנות בו, הוא לא הניב את המצופה?
כמו"כ אני מחזק אותך להבין יותר קודים שאתה מקבל/מעתיק, זה קשה גם לי, אבל אל תוותר. כשיש לך קוד, במיוחד כה קצר תתעקש להבין כל פיפס שלו, לא תתחרט. -
@yossiz אמר ב[שליפת שעה קודמת ומאוחרת של הממצא המבוקש
עוד מעט תעשה טסט וזה לא יעבוד או ש@dovid יגיע ויוכיח איך כתבתי נח עם 7 טעויות... אז מוקדם מדי לצחוק
באופן כללי כזה משפט ועוד ממך זה מאוד מחמיא, אבל בהקשר הזה זה כמעט לועג לרש...
הייתי כותב קוד הרבה פחות יפה פחות מדוייק ויותר ארוך. -
@dovid
עברתי כעת שוב על הקודים ואני רואה שאכן לא שמתי לב שחלק מהקוד אני הוספתי והוא לא מהמקורי ש @yossiz כתב, והסיבה שאני הוספתי אותו היא בגלל שבקוד שיוסי כתב אני מקבל את התוצאה הקרובה או השווה ללא הבחנה האם זה אכן שווה או שזה השעה הבאה הקרובה, ואני כן צריך לדעת האם זה השעה המבוקשת ישירות או השעה הבאה הקרובה.
וכן אני רוצה לדעת האם אני נותן לו את השעה האחרונה במערך כי זה מה שהוא ביקש או כי זה התוצאה הכי קרובה למה שהוא ביקש.
לכן הוספתי את הקוד שלי.
אני תוהה איך לשלב אותו במשפט אחד מבוסס על מה ש @yossiz כתב -
@dovid אמר בשליפת שעה קודמת ומאוחרת של הממצא המבוקש ממערך שעות:
הקוד שלך היינו שורות 10-14 הם בדיוק הדרך בה הייתי כותב,
קוד זה אינו מספיק בכדי לקבל את השעה הקודמת והבאה כשהוא מבקש שעה שהיא בתוך הטווח הנמצא במערך.
לכן אני צריך עדיין את מה ש@yossiz כתב -