חיפוש ( {{טקסט}} ) במחרוזת והחלפתם.
-
שלום וברכה
האם זו הדרך הנכונה והקלה לחפש ולהחליף
const subject = "hi {{firstname}} {{lastname}}"; const search = [...subject.matchAll(/({{)(.+?)(}})/g)]; search.map(item => { const token = item[2]; const replace = get...(token); // function to get text by token subject = subject.replace(item[0], replace); }) -
@ש-ב-ח דבר ראשון, תודה על השאלה! אני רואה שאלות כאלו כהזדמנות מצויינת להשתפשף והם תועלת לא רק לשואל אלא (או אפילו: בעיקר) לעונים.
חיפושים והחלפות זה אחד מהתחומים ב-JS שאני בודק את התיעוד כל פעם, כי משום מה זה לא נדבק לי בראש...
אבל זה מה שיצא לי כרגע:const subject = "hi {{firstname}} {{lastname}}"; const result = subject.replace(/{{(.+?)}}/g, (_, token) => getValueForToken(token)) כמה הערות על הקוד שלך:
- אין צורך להכניס את המסולסלים בתוך קבוצה ברג'קס, רק את ה-token עצמו
- שימוש ב-
map
לא מומלץ כאן כי אתה לא משתמש בערך המוחזר, במקום זה תשתמש ב-forEach
או בלולאתfor ... of
- כמו שאתה רואה בקוד שלי, אין צורך לעשות את הלולאה בעצמך כי
replace
מקבלת פונקציה - הערה לא חשובה על בחירת שמות משתנים: הייתי קורא למתשנה
search
בשםsearchResults
כי זה מייצג את תוצאת החיפוש ולא החיפוש עצמה. בתוך הלולאה הייתי קורא לכלitem
בשם פחות ג'נרי, למשל:searchResult
בלשון יחיד. (משתנים אלו מתייתרים בקוד שלי). - במקום
item[x]
שלא מתעד את הייעוד של המשתנה, הייתי עושה destructuring בפרמטרים של הפונקציה:
search.map(([placeholder, , token]) => { const replace = get...(token); // function to get text by token subject = subject.replace(placeholder, replace); }) -
-
@yossiz אמר בחיפוש ( {{טקסט}} ) במחרוזת והחלפתם.:
@ב-ל לפי התיעוד (שהלכתי לבדוק עכשיו...) משמע שגם בשימוש ב-
replaceAll
חייבים את דגלg
ואם כן אין יתרון בשימוש ב-replaceAll
מולreplace
. האם אני צודק.לפי איך שהבנתי לא צריך. אני מכיר את זה מכאן
-
@yossiz אמר בחיפוש ( {{טקסט}} ) במחרוזת והחלפתם.:
@ב-ל לפי התיעוד (שהלכתי לבדוק עכשיו...) משמע שגם בשימוש ב-
replaceAll
חייבים את דגלg
ואם כן אין יתרון בשימוש ב-replaceAll
מולreplace
. האם אני צודק.אכן, הreplaceAll בא לעולם בשביל להציל מתכנתים אומללים שמנסים להחליף הכל עם טקסט ולא עם ביטוי regex:
https://github.com/tc39/proposal-string-replaceall
מקרה שממחיש כמה לא טוב שפה שהתאימות לאחור שלה לא מוגבלת בזמן. -
@yossiz אמר בחיפוש ( {{טקסט}} ) במחרוזת והחלפתם.:
שימוש ב-map לא מומלץ כאן כי אתה לא משתמש בערך המוחזר, במקום זה תשתמש ב-forEach או בלולאת for ... of
באמת מעניין אותי אם זה משנה מאוד מבחינת ביצועים או כל סיבה אחרת
אם אני משתמש עם המערך רק עבור הלולאה ולא מעניין אותי מה הוא מכיל בסופו של דבר -
@ש-ב-ח מנסיוני זה שאלה של עקשנים... וזה נפוץ בפרט בJS, שאיש הישר בעיניו יעשה ואם תגיד לו מה לעשות יגיד לך טול קורה מבין עיניך, הרי JS דארעא חד הוא.
תאר לך שאתה רואה מתכנת שלא משתמש בif אלא בwhile עם יציאה בתוך הלולאה... זה שנכנס לך בראש שmap זה לעשות פעולה על כל איבר בלולאה וזה לא! זה לא סיבה להחזיק בו. מה רע לשנות הרגלים? יש המון רע בלהמשיך להשתמש בדבר לא מתאים: א. קריאות לעצמך ולאחרים (תאר לך שהיית עושה את כל התנאים בלולאה כנ"ל) ב. רמת קוד בעיני אחרים ג. הבנת קוד של אחרים אחרי שאתה רגיל לכתוב אחרת, ועוד ועוד.
ואם כבר ביצועים, כן, זה לוקח קצת זיכרון ואפילו אולי מעבד מיותרים, אבל צריך טלסקופ להבחין בדברים האלה. -
@ש-ב-ח עזוב את העובדה שלמילה Map יש משמעות, אנשים שנתקלים בMap מצפים להתנהגות מסויימת, במילים אחרות: מעבר לפונקציונליות של הקוד, למוסכמות יש ערך לא פחות חשוב (אפילו אם ההתנהגות של שני המתודות היו זהות).
-
@dovid אמר בחיפוש ( {{טקסט}} ) במחרוזת והחלפתם.:
א. קריאות לעצמך ולאחרים
@רפאל אמר בחיפוש ( {{טקסט}} ) במחרוזת והחלפתם.:
אנשים שנתקלים בMap מצפים להתנהגות מסויימת,
היינו הך.
קיבלתי.
-
9/12