קורס Front-End Web Development שיעור תרגול מערכים ואובייקטים

function T6(...arr)
{
    var flag = 0;
    var NewArry = [];
    console.log(arr.length);
    for(var i=0; i<arr.length; i++)
        {
            for(var j=i+1;j<arr.length;j++)
                {
                    if(arr[i] === arr[j])
                        flag=1;  
                }
            if(flag===0)
                NewArry.push(arr[i]);
            flag=0;   
        }
    console.log(NewArry);
}

איך הפתרון של התרגיל?

הי,

קודם כל שימי לב שהשתמשת בגרש הלא נכון (את שמת גרש בודד וצריך גרש הפוך - זה מה שיוצא כשכותבים ~ רק בלי ללחוץ על ה Shift, כלומר הסימן הזה: `)

עכשיו לגבי הפיתרונות-

אני חושד שתרגיל 5 לא יעבוד טוב בקלטים מסוג מחרוזת, למשל:

T5("hello ", "world")

נסי להריץ על קלט זה ותראי מה יוצא לך.

לגבי תרגיל 6 - יש מספר דרכים לעשות את הקוד הזה קצת יותר קריא:

  1. הכי קל להשתמש במבנה נתונים מסודר שמזהה כפילויות למשל Set, אפשר לשמוע עליו בשיעור הזה מקורס ES6:
    https://www.tocode.co.il/bundles/es6/lessons/maps-and-sets

  2. עוד אפשרות יותר כללית היא לקחת את הקוד המסורבל בלולאה הפנימית ולהוציא אותו לפונקציה נפרדת עם שם בעל משמעות. הפרדה לפונקציות היא דרך טובה להפוך כל קוד לקל יותר לקריאה

עוד מחשבה לגבי חלוקה לפונקציות- נניח שהקוד הראשי היה נראה כך:

function T6(...arr) {
  const uniq = [];

  for (var i=0; i < arr.length; i++) {
    if (hasOnlyOne(arr, arr[i])) {
      uniq.push(arr[i]);
    }
  }
}

אז הקוד כבר הופך להרבה יותר ברור בלי לשנות כלום במבנה ובלוגיקה

הי,

לגבי תרגיל 2, להלן:

לגבי תרגיל 1, שכתבתי באמצעות המלצתך (E6) ע"י Array.from(arguments):

העיניין שלא הצלחתי במידה ושולחים מערך, להלן תיעוד הניסיון:

גם כשהכנסתי פרמטר לפונקציה עם שלוש נקודות זה לא עבד לי.
מה הסיבה לדעתך?
תודה מראש.

הי ניר,

הבעיה שאתה יוצר מערך פעמיים - אתה מעביר לפונקציה מערך, ואז מסתכל על כל הארגומנטים שהיא קיבלה בתור מערך נוסף. כך בתוך הפונקציה המשתנה arguments מכיל למעשה כבר מערך:

arguments = [[2,3,4]]

שזה מערך של איבר אחד שהאיבר הראשון שלו הוא מערך.

יש לך שתי דרכים לצאת מזה, האחת להשתמש באופרטור 3 נקודות בעת הקריאה לפונקציה כדי לשבור את המערך:

console.log(sumArg(...arr1))

אפשרות שניה בתוך הפונקציה להסתכל על הפרמטר הראשון (והיחיד) שהיא קיבלה בתור המערך שהוא כבר:

function sumArg(numbersArray){
  let res=numbersArray.reduce(sum);
  return res;
}

היי,
אני רוצה לתרגל טוב יותר את הנושא של מערכים ואובייקטים.
תוכל לתת לי תרגילים נוספים או להפנות אותי לאתר שנותן תרגילים טובים בנושא?

הי,

זה נראה לי מוצלח:

עדכני אם אהבת, אם קל מדי או אם קשה מדי ונראה איך ממשיכים.

וכאן יש דף דומה לאוביקטים:

היי, אפשר בבקשה את הפתרונות לשאלות?

הי,

אני לא מפרסם פיתרונות ובכוונה. המטרה של התרגילים היא לתת מקום לנסות וכן ״לשבור את הראש״ עד שמצליחים.

אני כן שמח לעזור בשיטוט הזה ואם נתקעים אפשר לשים פה שאלות או התחלה של דברים שכתבת וננסה להתקדם איתם, ואפשר גם להסתכל אחורה כאן בדיונים כדי למצוא רעיונות לפיתרונות שתלמידים אחרים הגישו (למרות שאני ממליץ קודם לפתור לבד)

בהצלחה

אין בעיה, פשוט התרגולים הם על חומר שלא נלמד :slight_smile: לא הבנתי איך עושים VARARGS בJS, כי עשיתי כמו שמישהו עשה שם לפניי:

    function sum(...arr){
        return arr.reduce((a,b)=>a+b);
                }
    var a= [1,2,3,4];
    var b= [1,2,4];
    console.log(sum(a));
    console.log(sum(b));

אבל זה לא עובד…

אולי אפשר לנסות לוותר על השלוש נקודות?

חסר לי פשוט מידע בסיסי על מתודות בjs. בjava צריך לציין את סוג וכמות הפרמטרים ואם רוצים להעביר כמות לא ידועה של ארגומנטים אז פשוט שמים 3 נקודות בהגדרה של המתודה.
איך זה עובד בjs? קודם ראיתי בקוד שכתבתי שאם מגדירים מתודה בלי פרמטרים אז אפשר בכל מקרה להעביר אליה ארגומנטים כשקוראים לה.

בלי השלוש נקודות זה עובד.

       var sum= function(arr){
            return arr.reduce((a,b)=>a+b);
                    }
        var a= [1,2,3,4];
        var b= [1,2,4];
        console.log(sum(a));
        console.log(sum(b));
לייק 1

מדויק - ובואי נראה למה

את מפעילה את הפונקציה עם:

sum(a)

וזה אומר שבתוך גוף הפונקציה המשתנה arr מקבל את הערך של המערך a שהגדרת בחוץ. הפונקציה reduce שלך מדויקת ומחשבת את הסכום.

לגבי ה-3 נקודות את יכולה למצוא הסבר עליו בוידאו כאן (בחלק השני של הוידאו):
https://www.tocode.co.il/bundles/es6/lessons/parameters?tab=video

וכדאי גם לקרוא על המילה השמורה arguments בתיעוד כאן:

שלום ינון,

אתה יכול להסביר מה ההבדל בין var ל-let? מתי נעדיף להשתמש בכל אחד מהם וכו’.

תודה

הי נתנאל,

בטח - ואגב אתה יכול להחליף את שם המשתמש בפורום (לוחץ בצד שמאל למעלה על האייקון 1 ושם נכנס לפרטים שלך)

ההבדל בין let ו var הוא הבדל של תחום הגדרה. הפקודה let מגדירה משתנה כך שאותו משתנה יוכר בבלוק אשר בו הוא הוגדר, והפקודה var מגדירה משתנה שיוכר בפונקציה בה הוא הוגדר. אני חושב שדוגמת קוד קצרה תעזור להבין את המשחק כאן.

נתחיל עם var:

function test() {
  if ( 2 < 5 ) {
      var x = 10;
  }

  console.log(x);
}

test();

הקוד מדפיס 10 בלי בעיה כיוון ש 2 קטן מחמש וכיוון שהגדרת משתנה עם var משפיעה על כל הפונקציה.

מה קורה ב let? הנה אותה דוגמא כשאני מחליף את שיטת הגדרת המשתנה:

function test() {
  if ( 2 < 5 ) {
      let x = 10;
  }

  console.log(x);
}

test();

הפעם הקוד זורק שגיאה:

/Users/ynonperek/a.js:6
  console.log(x);
              ^

ReferenceError: x is not defined
    at test (/Users/ynonperek/a.js:6:15)
    at Object.<anonymous> (/Users/ynonperek/a.js:9:1)
    at Module._compile (internal/modules/cjs/loader.js:701:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
    at Module.load (internal/modules/cjs/loader.js:600:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
    at Function.Module._load (internal/modules/cjs/loader.js:531:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:754:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)

הסיבה שהמשתנה x מוכר רק בתוך הבלוק בו הוא הוגדר ולא בכל הפונקציה.

מבחינת העדפות שימוש ברירת המחדל ברוב שפות התכנות שאינן JavaScript או Python היא let, לכן רוב המתכנתים ירגישו יותר בנוח עם משתנים שמוכרים רק בבלוק בו הם הוגדרו. מסיבה זו היום גם ב JavaScript מקובל להשתמש ב let.

אתה יכול לשמוע יותר על החידושים ב JavaScript כולל על ההבדל בין let ו var בקורס JavaScript ES6 כאן באתר, למרות שאני ממליץ לסיים קודם את קורס הבסיס Front End Web Development

//ex1

function sum (x,y){

return x+y;

}

let arguments = [1,2,3,4,5,6,7,8,9,10];

let me = ()=>{

return arguments.reduce(sum);

}

console.log(me);

//ex2

let parapara=[1,2,1,2,1,2,4,5,5,5,5];

let him = new Set(parapara);

console.log(him);

אהבתי את הפיתרון עם ה reduce. שים רק לב שזה לא עובד טוב כשרשימת הארגומנטים ריקה:

> [].reduce((x, y) => x + y)
TypeError: Reduce of empty array with no initial value
    at Array.reduce (<anonymous>)

לכן מקובל להעביר ערך ראשוני ל reduce באופן הבא:

> [].reduce((x, y) => x + y, 0)