שליפת שעה קודמת ומאוחרת של הממצא המבוקש ממערך שעות
-
לאחר כמה התאמות כדי לדעת האם זה הקודם או הבא, זה הקוד המלא.
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 כתב -
-
@חוקר אמר בשליפת שעה קודמת ומאוחרת של הממצא המבוקש ממערך שעות:
@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]};
תקן אותי אם אני טועה