שליפת שעה קודמת ומאוחרת של הממצא המבוקש ממערך שעות
-
@חוקר אמר בשליפת שעה קודמת ומאוחרת של הממצא המבוקש ממערך שעות:
@dovid
עברתי כעת שוב על הקודים ואני רואה שאכן לא שמתי לב שחלק מהקוד אני הוספתי והוא לא מהמקורי ש @yossiz כתב, והסיבה שאני הוספתי אותו היא בגלל שבקוד שיוסי כתב אני מקבל את התוצאה הקרובה או השווה ללא הבחנה האם זה אכן שווה או שזה השעה הבאה הקרובה, ואני כן צריך לדעת האם זה השעה המבוקשת ישירות או השעה הבאה הקרובה.
וכן אני רוצה לדעת האם אני נותן לו את השעה האחרונה במערך כי זה מה שהוא ביקש או כי זה התוצאה הכי קרובה למה שהוא ביקש.
לכן הוספתי את הקוד שלי.
אני תוהה איך לשלב אותו במשפט אחד מבוסס על מה ש @yossiz כתבאני לא מבין, הקוד של @yossiz עונה על הכל לפי קריאת הקוד.
אני כעת אבל בודק בפועל. -
בדקתי, הקוד המקורי היה מושלם, בתיקון תיקנת בטעות את ה
nearestIndex === -1
.
הנה הקוד שעובד, בדיוק מה ש@yossiz כתב למעט האובייקט של הקודם והבא שהוספת בטוב טעם:let availableTimes = ['18:15:00', '19:00:00', '19:45:00', '20:15:00', '21:30:00']; console.log(findTimeFromRange(availableTimes, 1830)); console.log(findTimeFromRange(availableTimes, 2130)); console.log(findTimeFromRange(availableTimes, 2135)); 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); const nearestIndex = normalizedTimes.findIndex(time => time >= givenTime); if (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]}; }
הנה לצפות בתוצאות https://repl.it/@davidlevtov/StarryNimbleParticles#index.js
-
@dovid אמר בשליפת שעה קודמת ומאוחרת של הממצא המבוקש ממערך שעות:
הנה הקוד שעובד, בדיוק מה ש@yossiz כתב למעט האובייקט של הקודם והבא שהוספת בטוב טעם:
הבעיה של הקוד (שזה הסיבה שהוספתי את הקוד שלי)
היא מה קורה במקרה כזה:console.log(findTimeFromRange(availableTimes, 1730));
התוצאה שקיבלתי היא:
{ next: undefined, previous: 1815 }
האמת שבעצם זה לא הכי נורא, אבל כן הייתי מעדיף לקבל רק את previous ללא ה next. -
@חוקר זה בהחלט לא נורא, אבל תוכל להוסיך שורה שבודקת אם זה == 0, ככה:
if (nearestIndex === -1) return {'previous' : normalizedTimes[normalizedTimes.length - 1]}; if (normalizedTimes[nearestIndex] === givenTime) return {'this' : givenTime}; if (nearestIndex === 0) return {'next' : normalizedTimes[0]}; return {'next' : normalizedTimes[nearestIndex - 1], 'previous' : normalizedTimes[nearestIndex]};
השמטתי את הelse כי בכל מקרה הreturn עוצר את הפונקציה.
-
@dovid אמר בשליפת שעה קודמת ומאוחרת של הממצא המבוקש ממערך שעות:
return {'next' : normalizedTimes[nearestIndex - 1], 'previous' : normalizedTimes[nearestIndex]};
אם אני צודק זה אמור להיות הפוך:
return {'previous' : normalizedTimes[nearestIndex - 1], 'next' : normalizedTimes[nearestIndex]};
תקן אותי אם אני טועה