חדש ב JavaScript: פונקציות עזר לאיטרטורים
אחת הפונקציות האהובות עליי ב JavaScript היא find. עם find אני יכול למצוא את האיבר הראשון במערך שמתאים לתנאי ולעצור כשמצאתי אותו, כלומר הקוד הזה מגריל 100 מספרים בין 0 ל 100 ומדפיס את הראשון מהם שגדול מ-50:
new Array(100).fill(0).map(i => Math.floor(Math.random() * 100)).find(p => p > 50)
אבל עדיין יש פה משהו צורם בקוד - בשביל מה היית צריך להמשיך להגריל מספרים אחרי שמצאת את הראשון שגדול מ-50? כתיב השורה אחת צריך לעבוד יותר קשה מכתיב הלולאה המקביל:
for (let i=0; i < 100; i++) {
const r = Math.floor(Math.random() * 100)
if (r > 50) { console.log(r); break; }
}
מה עושים? מתקנים את JavaScript כמובן כדי שאפשר יהיה לכתוב את כל הלולאות בשורה אחת ובלי עבודה מיותרת בעזרת פונקציות עזר לאיטרטורים - פיצ'ר חדש שנכנס כבר לכל הדפדפנים והתקבל לאיפיון של ES2025, וזה נראה ככה:
- הפונקציה values של מערך מחזירה איטרטור.
- לאיטרטור יש פונקציות כמו map, filter, take, drop שמשפיעות על מהלך האיטרציה.
- לאיטרטור יש פונקציית next שמחזירה את הערך הבא ממנו.
ולכן הלולאה נראית כך:
new Array(100).values().map(() => Math.floor(Math.random() * 100)).filter(i => i > 50).take(1).next().value
שורה אחת, מגרילה עד 100 מספרים ומחזירה את הראשון שגדול מ-50.
ואם אני רוצה את ה-3 מספרים הראשונים שגדולים מ-50? אין שום בעיה פשוט נשתמש ב toArray במקום ב next:
new Array(100).values().map(() => Math.floor(Math.random() * 100)).filter(i => i > 50).take(3).toArray()
את רשימת כל הפונקציות החדשות של איטרטורים אפשר למצוא בתיעוד בקישור:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Iterator