שימוש באובייקט שנשאר ברקע ומשתנה, באופן ששינוי בו לא ישתקף באובייקטים אחרים שהורשו ממנו
-
אני מקוה להיות מספיק מובן, כיון שזה מסובך מאד להציג את זה בJSFIDDLE
מדובר על js.
לדוגמא:
אני רוצה לשלוח מייל למספר אנשים.
למייל מצורפים קבצים שונים ומשתנים.
אני רוצה לערוך רשימה ארוכה של מיילים (arr-mails), שבכל איבר בו מסודרים: 1-רשימת נמענים, 2- רשימת הקבצים.ראשית עשיתי 2 מערכים.
1 שבו נכנס רשימת האנשים שישלח אליהם המייל, (arr-mambers)
2 רשימת הקבצים שיצורפו לכל אחד מהמיילים (arr-files).
ועכשיו יש מערך שלישי (arr-data)- שכל איבר שלו הוא אובייקט המכיל את נתוני האנשים אליהם ישלח המייל, וכן נתוני הקבצים. וכאשר נוצר איבר, אני יכול לערוך את נתוני המייל הבא.הבעיה, שכשאני מצרף את נתוני המערך arr-files למערך arr-mails, הוא מקבל אותו כאובייקט חי, מה שאומר שכל שינוי שאני עושה במקור באובייקט arr-files משתקף גם כן בכל האיברים שבarr-mails המכילים את נתוני האובייקט הזה.
השאלה איך אני יכול להכניס את הנתונים של arr-files לתוך arr-mails, בלי שאח"כ יהיה שינוי בarr-mails בכל פעם שאני ישנה את אובייקט המקור arr-files.
תודה.
-
או עם ספריית lodah:
var copy = _.cloneDeep(arrFiles);
https://lodash.com/docs/4.17.10#cloneDeep
(ובאנגולר יש את
angular.copy()
שעושה אותו דבר) -
@dovid אמר בשימוש באובייקט שנשאר ברקע ומשתנה, באופן ששינוי בו לא ישתקף באובייקטים אחרים שהורשו ממנו:
@zvizvi שים לב שמה שהבא זו העתקה עמוקה, וזה יקר יותר.
זה שימושי כשרוצים שגם האובייקטים שבתוך המערך ישכופלו וגם המאפיינים שלהם האובייקטים וכן הלאה.
זה מן הסתם עובד ע"י המרה לJSON וחזרה, בכל אופן זה מיותר בהעתקה שטחית של מערך.צודק, ובשביל העתקה רגילה יש את:
_.clone()
(אני לא יודע אם זה עובד ע"י המרה לJSON, כי אם כן לא ניתן לבצע את זה על אובייקט שיש לו בן שמצביע על בן אחר. (circular structure). או שאולי גם לזה יש פתרונות).
-
@אהרן אמר בשימוש באובייקט שנשאר ברקע ומשתנה, באופן ששינוי בו לא ישתקף באובייקטים אחרים שהורשו ממנו:
חושב שהם משתמשים עם פונקצית assign.
זה לפחות הדרך שלי ליצור העתקים של אוביקטים.הבעיה שצריך לעשות את זה ברקורסיה.
כי assing מעתיק רמה עליונה, אבל מאפייני בנים מסוג אובייקט ימשיכו להיות התייחסות לאותו אובייקט מקור.