Month: November 2020

  • การทำ Partial Rendering สำหรับ User Controls

    สำหรับท่านใดที่ยังใช้งาน ASP.NET Web From ในการพัฒนาเว็บไซต์อยู่ คงคุ้นเคยกับการใช้งาน User Controls เป็นอย่างดีเนื่องจากเป็นการสร้าง UI เพื่อใช้งานซ้ำในหลายๆ Page ซึ่งเป็นที่นิยม สำหรับบทความนี้จะแนะนำวิธีการ แยกเรนเดอร์ User Controls ที่มีปัญหาโหลดช้าอันเนื่องมาจากสาเหตุใดก็ตาม และเป็นข้อมูลเพิ่มเติมที่ผู้ใช้ไม่จำเป็นต้องเห็นเป็นอย่างแรก โดยมีขั้นตอนดังนี้

    1.เพิ่ม HTML Container element เช่น Div, Panel ในหน้าจอ ที่ต้องการใช้งาน เช่น

    2.เพิ่ม Ajax Controls toolkit : Dynamic Populate ใช้เพื่อ Render HTML หลังจากที่ Page Load เสร็จเรียบร้อย

    • TargetControlsID คือ ID ของ HTML Container element ที่เราต้องการแสดงผล HTML ของ User Controls ที่เราสร้างมาจาก Web Service
    • ServicePath คือ Path ของ Web Service ที่เรียกใช้งาน
    • ServiceMethod คือ Web Method ที่ใช้ Render User Controls
    • UpdatingCssClass คือ CSS Class ที่ต้องการให้แสดงระหว่างรอ Load HTML

    3.Java Script เรียกใช้งาน  Ajax Controls toolkit : Dynamic Populate และเพิ่มเติมฟังก์ชันที่ต้องการขณะแสดงผล User Controls

    4.สร้าง Web Method สำหรับสร้าง HTML ของ User Controls

    • รูปแบบของ Web Service Method ซึ่งจะต้องมี Return Type เป็น string และรับ Parameter ชื่อ contextKey ซึ่งมี Type เป็น string เช่นกัน
    • เรียก Method ชื่อ RenderUserControl โดยระบุ Path ของ User Control ที่ต้องการ และ List ของ Property ทั้งหมดของ User Control

    5.Method ที่ใช้ในการสร้างเนื้อหา HTML จาก User Controls

    เพียงเท่านี้ เราก็สามารถเรียกใช้งาน User Control นี้ในหน้าจอต่างๆ ได้โดยไม่ต้องกังวลเรื่องเพิ่มเวลาโหลดให้กับหน้าจอแสดงผลนั้นๆแล้วครับ อย่างไรก็ดีบทความนี้ผมได้เขียนไว้นานมากแล้ว แต่ยังไม่ได้นำมาเผยแพร่ ในปัจจุบันอาจมีวิธีการอื่นๆ และ ASP.NET ที่เป็น Web Form อาจจะได้รับความนิยมน้อยลงไปแล้ว แต่สำหรับท่านที่ต้องดูแล และปรับปรุงระบบเก่าๆ ไม่สามารถเขียนขึ้นมาใหม่ทั้งหมดได้ ก็ยังสามารถนำเทคนิคนี้ไปปรับใช้กับระบบของตนเองได้ครับ

  • ทำให้แอปพลิเคชันอ่านหรือสร้าง Barcode ได้ด้วย ZXing (“zebra crossing”)

    เนื่องด้วยได้รับโจทย์ให้พัฒนาแอปพลิเคชัน ที่สามารถแสกนบาร์โค้ดได้เมื่อได้ค้นหาดูก็พบชื่อของ Library ที่แรกเริ่มเขียนด้วยภาษา Java และถูก Port ให้รองรับภาษาอื่นๆอีกมากมาย เป็นที่นิยม และเป็น Open Source นั้นคือ ZXing โดยในบทความนี้จะแสดงตัวอย่างวิธีการนำ ZXing.Net.Mobile มาใช้งานร่วมกับ Xamarin.iOS

    ขั้นตอนการนำมาใช้งาน

    ตัวอย่างในบทความใช้ Visual Studio 2019 16.8.0 ติดตั้ง Work Load Xamarin.iOS

    1.สร้างโปรเจคใหม่โดยเลือก Template ชื่อ iOS App (Xamarin) และกำหนดค่าดังรูป

    2. โดยโครงสร้างไฟล์ของโปรเจคมีดังรูป

    3. เปิดไฟล์ Main.storybord สร้าง View และเพิ่มปุ่ม btnScanBarcode (สำหรับ Xamarin.iOS บน Windows จะไม่สามารถแก้ไขไฟล์ .storybord ได้แล้วในเวอร์ชันนี้ ต้องทำบน macOS เท่านั้น)

    4.ติดตั้ง ZXing.Net.Mobile ผ่าน Nuget Package โดยคลิกขวาที่ชื่อโปรเจค เลือก Manage Nuget Packages ค้นหาคำว่า ZXing เลือก Install

    5.สร้าง Controller สำหรับ View ที่ได้สร้างไว้ก่อนหน้านี้ และเพิ่มโค้ดดังนี้

    using System;
    using UIKit;
    using ZXing.Mobile;
    
    namespace ZXingScanBarcode
    {
        public partial class ViewController : UIViewController
        {
            public ViewController(IntPtr handle) : base(handle)
            {
            }
    
            public override void ViewDidLoad()
            {
                scanner = new MobileBarcodeScanner(this.View);
                btnScanBarcode.TouchUpInside += async (sender, e) =>
                {
                    scanner.UseCustomOverlay = false;
                    scanner.TopText = "Hold camera up to barcode to scan";
                    scanner.BottomText = "Barcode will automatically scan";
    
                    var result = await scanner.Scan(false);
    
                    HandleScanResult(result);
                };
    
            }
    
            void HandleScanResult(ZXing.Result result)
            {
                this.InvokeOnMainThread(() =>
                {
                    if (result != null && !string.IsNullOrEmpty(result.Text))
                    {
                        //แสดงค่าที่อ่านได้ใน UILabel
                        lblBarcode.Text = result.Text;
    
                        //เชื่อมต่อ API เพื่อใช้บาร์โค้ดที่อ่านได้ทำอะไรบางอย่าง ตรงนี้             
                    }
                    else
                    {
                        UIAlertController alert = UIAlertController.Create("Scanning Canceled!", string.Empty, UIAlertControllerStyle.Alert);
                        alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, null));
                        PresentViewController(alert, true, null);
                    }
                });
            }
        }
    }
    

    6. จากนั้นให้เปิดไฟล์ info.plist เพื่อเพิ่มข้อมูลคำอธิบายการขอสิทธิการใช้กล้อง และส่วนอื่นๆที่ ZXing ต้องการดังรูป (ในส่วนคำอธิบายสามารถปรับเปลี่ยนให้ดีกว่านี้ได้)

    7.เพียงเท่านี้ก็สามารถกด Run เพื่อทดสอบกับอุปกรณ์ที่เชื่อมต่อได้แล้ว (ไม่สามารถทดสอบบน Simulator ได้เนื่องจากต้องใช้กล้อง)

    สำหรับบทความนี้ค่อนข้างจำเพาะเจาะจงกับเครื่องมือที่ใช้พัฒนาแอปพลิเคชัน ที่จะต้องเป็น Xamarin.iOS บน Visual Studio เท่านั้น แต่ด้วยชื่อของ ZXing ท่านที่ใช้เครื่องมืออื่นๆสามารถนำไปค้นหาเวอร์ชัน และวิธีการใช้งานสำหรับเครื่องมือนั้นๆเพิ่มเติมได้ อย่างน้อยก็เป็นการแนะนำให้นักพัฒนาที่ได้อ่านบทความนี้ ได้รู้จัก Library ในงานด้านนี้เพิ่มอีก 1 ตัวครับ

  • การเชื่อมต่อ AwesomeTable กับ Google Site

    ต่อเนื่องจาก Blog : การใช้งานโปรแกรม AwesomeTable แบบง่าย
    เมื่อสร้าง AwesomeTable เรียบร้อยแล้ว สามารถนำมาใช้งานบน Google Site ได้ ลองมาดูวิธีการทำกันนะคะ

    1. ต้องการนำ AwesomeTable ไปเชื่อมต่อกับ Google site โดยคลิกที่ “EMBED”

    2. เลือกแท็บ Direct Link ให้คลิกปุ่ม “Copy”

    3. เปิด Google Site ที่ผู้ใช้ต้องการนำ AwesomeTable ไปใช้งาน คลิก “Embed”

    4. วาง Embed แล้วคลิกปุ่ม “Insert”

    5. ข้อมูล AwesomeTable ที่ได้สร้างไว้ ก็จะมาอยู่ใน Google site ผู้ใช้สามารถปรับการใช้งานได้ เช่น FQAs โดยแบ่งเป็นระบบ ระบบย่อย ซึ่งสามารถค้นหาข้อมูลได้ และหากต้องการเพิ่มข้อมูลต้องไปเพิ่มใน Google Sheet

    หวังว่า Blog นี้ผู้ใช้จะได้รับความรู้ที่เป็นระบบที่ใช้งานแบบง่ายให้สามารถปรับใช้งานให้เข้ากับที่ต้องการได้ค่ะ

  • การใช้งานโปรแกรม AwesomeTable แบบง่าย

    เป็นเว็บที่จัดทำเป็น Data Table มีการใช้งานผ่าน Google sheet ที่มีรูปแบบ Template หลากหลายให้เลือกใช้งานได้ และสามารถนำไปใช้งานกับ Google site ได้ทันที

    เว็บไซต์ : https://awesome-table.com/
    สามารถอ่านรายละเอียดจาก AwesomeTable : https://support.awesome-table.com/hc/en-us

    ตัวอย่างนี้จะเป็นการใช้จาก Template ที่มีให้เลือก ลองมาดูกันเลยว่าทำกันอย่างไร ง่ายๆ ใครๆ ก็ทำได้ค่ะ

    1. เข้าเว็บไซต์ : https://awesome-table.com/ เลือก “TEMPLATE GALLERY”

    2. แสดง Template ที่ให้เลือกใช้งานได้มากมาย ผู้ใช้สามารถเลือกตัวอย่าง Template ที่รูปแบบลักษณะคล้ายกับงานที่ต้องการ แล้วค่อยมาปรับแก้ เป็นแนวทางที่ใช้งานง่ายที่สุด

    3. ตัวอย่างนี้จะใช้ Template ที่มีชื่อว่า “Editable List with Google Forms”

    4. แสดงข้อมูลตาม Template ที่ได้เลือกไว้ หากเราต้องการใช้งานให้คลิก “USE TEMPLATE”

    5. แสดงตัวอย่างข้อมูล การ Filters ข้อมูลตามรูป หากต้องการปรับแก้ข้อมูล หรือการ Filters สามารถไปปรับได้ที่ Google Sheet คลิก “OPEN” เพื่อไปแก้ไขตามที่ผู้ใช้ต้องการ

    6. เมื่อเปิดแล้วจะได้ไฟล์ Google Sheet ดังรูป โดยเราสามารถปรับส่วนของการ Filters ข้อมูลได้

    7. หากต้องการปรับแก้การ Filters ดูตัวอย่างได้จาก
    URL : https://support.awesome-table.com/hc/en-us/articles/115001068189-Filters-select-data-to-display
    การ Filter จะมีดังนี้ สามารถศึกษาได้จาก url
    1. StringFilter
    2. NumberRangeFilter
    3. DateFilter
    4. CategoryFilter
    5. csvFilterAnd
    6. csvFilterOr
    7. Dependency filters
    8. Filter captions

    8. ตัวอย่างที่นำไปใช้งานกับการทำ FAQs ให้สามารถค้นหาตามระบบ ระบบย่อย หรือคำค้นได้

    9. ตัวอย่างการ Filter ใน Google Sheet

  • แก้ปัญหาอัปโหลด Android App ไม่ผ่านเพราะเปลี่ยนคนอัปโหลด

    เคยไหมที่ฝากทีมอื่นที่เขามี account google play console อยู่แล้ว เพื่อฝากอัพเดทแอปที่เราเพิ่ม feature ใหม่ๆของแอปที่เราพัฒนา ตอนนั้นก็ได้ลองผิดลองถูกกันไปเรื่อยๆ เพราะว่าตอนที่เรา build app มันจะสร้าง signing key ในการอัปโหลดที่ผูกติดกับ user ดังนั้นเมื่อเปลี่ยน user ในการอัปโหลดก็ต้องอัปโหลด signing key ใหม่

    วันนี้จะมา KM การเปลี่ยน signing key เผื่อใครเคยเจอปัญหาเดียวกัน

    หน้าจอแสดงการอัปโหลด Android app ไม่ผ่าน เพราะ signing key ไม่ตรงกับ user เก่า

    โดยเข้าที่เมนู App signing เพื่อดูรายละเอียดเพิ่มเติม

    หน้าจอแสดงรายละเอียด signing key ที่สามารถอัปโหลดจะเห็นได้ว่า SHA ผูกติดกับ user เก่า ดังนั้นเพื่อแก้ปัญหานี้ เราต้อง Upload certificate ใหม่

    โดยที่เราต้องไปที่ project ของเราเพื่อดึงค่า key store ใหม่ โดยใช้คำสั่ง expo fetch android:keystore (คำสั่งขึ้นอยู่กับ project ว่าใช้ Tool อะไร ถ้าใช้ Expo ใช้คำสั่งนี้) ก็จะเห็นค่า Key password ที่เราตั้งไว้ (ขั้นตอนนี้จะได้ไฟล์ .jks)

    การสร้าง signing key ใหม่ โดยใช้คำสั่ง expo fetch android:upload-cer (ขั้นตอนนี้เราจะได้ไฟล์ .pem)

    จากนั้นเราเราก็ส่งข้อมูลไฟล์ .pem โดยคลิก https://support.google.com/googleplay/android-developer/contact/key อัปโหลดไฟล์ .pem ใหม่ จากนั้นก็รอ mail แจ้งกลับจาก Google play console เมื่อ approved เรียบร้อยแล้ว เราก็จะอัปโหลดแอปได้ตามปกติ

    ที่มา : https://support.google.com/googleplay/android-developer/answer/9842756

  • Word : การปรับรูปแบบ font สารบัญตามที่เราต้องการ

    กลับมาอีกครั้งกับเรื่อง Word สืบเนื่องมาจาก Blog ที่แล้วที่กล่าวถึงเรื่องการได้มีส่วนช่วยเพื่อนร่วมงานในการทำคู่มือ จึงได้มีโอกาสในการใช้งาน Word ซึ่งปัญหาที่พบอีกเรื่องก็คือ Font สารบัญ ไม่ใช่รูปแบบ Font ที่ต้องการคือ TH SarabunPSK ผู้เขียนจึงได้เขียนเรื่องนี้ขึ้นมาเพื่อที่ผู้อ่านจะสามารถนำไปใช้งานได้

    ตัวอย่าง ผู้เขียนได้ทำการสร้างเนื้อหาทดสอบ ใน Style Heading และใส่สารบัญเรียบร้อย ดังภาพ จะเห็นได้ว่า Font ในเนื้อหา เป็น TH SarabunPSK ตามที่ตั้งค่าใน Style Heading1 ไว้ตามที่ต้องการ แต่ส่วนสารบัญนั้นเป็น Font แปลก ๆ ไม่ใช่ Font ที่เราต้องการ

    เริ่มทำการเปลี่ยน Font โดยไปที่ที่เราเลือกสารบัญแบบอัตโนมัติมาใส่ คือไปที่ Menu References -> Table of Contents -> Custom Table of Contents…

    จะพบหน้าต่าง Modify Style ที่ส่วนล่างซ้าย เลือก Format -> Font

    ที่หน้าต่าง Table of Contents มุมล่างขวา เลือก Modify… เพื่อเข้าไปแก้ไขรูปแบบ Font

    จากนั้นหน้าต่าง Style เลือก Level สารบัญที่ต้องการแก้ไขรูปแบบ ในที่นี้เลือกแก้ไขสารบัญ Level 1 จากนั้นกดปุ่ม Modify

    เรื่องน่ารู้

    TOC ย่อมาจาก Table of Contents ซึ่งก็คือ สารบัญนั่นเอง

    จะพบหน้าต่าง Font นี่คือ Font ตั้งต้นที่เราได้ จะเป็นว่าไม่ใช่สิ่งที่เราต้องการ แก้ไขได้เลย

    แก้ไขให้เป็น Font ที่เราต้องการทั้ง 2 จุด คือ Latin Text และ Conplext scripts จากนั้น กดปุ่ม OK ออกมาเรื่อย ๆ

    กลับออกมาจนเกือบจะถึงขั้นตอนสุดท้าย จะมีหน้าต่างถามว่า จะเปลี่ยนจริง ๆ ละนะ จะทับของเดิมละนะ ตอบ Yes ไปเล้ย

    แถ่นแท๊นนน ผลลัพธ์สุดท้าย สวยงามอย่างที่เราต้องการ เย้!

    หวังว่าเนื้อหาเรื่องนี้คงจะมีประโยชน์ต่อผู้อ่านไม่มากก็น้อยนะคะ ขอบคุณค่าา 😀😍

  • Word : การใส่รูปแบบเลขหน้าที่ต่างกันในไฟล์เดียวกัน

    เคยไหมที่เวลาผู้อ่านจะสร้างคู่มือหรือเอกสารที่ต้องมีคำนำ สารบัญ ต่อด้วยเนื้อหา อาจจะจบด้วยภาคผนวก

    ซึ่งแต่ละส่วนนั้นมีการแสดงเลขหน้าที่ไม่เหมือนกัน ส่วนคำนำ สารบัญ อาจจะใช้เลขหน้าเป็นตัวอักษร เช่น ก, ข

    แต่ส่วนเนื้อหาใช้ตัวเลขอารบิค

    ในช่วงนี้ ผู้เขียนได้มีการช่วยเหลือเพื่อนร่วมงานในเรื่องนี้ในการทำคู่มือจึงได้นำลงมาใส่ไว้ใน Blog เผื่อเป็นประโยชน์แก่ท่านผู้อ่าน

    ตัวอย่าง ผู้เขียนสร้างเนื้อหามา 2 บรรทัดเพื่อเป็นเนื้อหาทดสอบในการใส่เลขหน้า

    จากนั้นทำการใส่ตัวแบ่งหน้า โดยเลือกเป็น Section Breaks -> Next Page

    จากนั้นใส่เลขหน้าเป็นเลขอารบิคปกติ เลขหน้าจะเริ่มที่หน้าที่ 1 และ 2 ไปเรื่อย ๆ

    จากนั้นผู้อ่านของดูที่แถบ Ribbon ใน Tab Header & Footer และพบเมนู Link to Previous ซึ่งจะเป็นว่าเมนูนี้ถูกไฮไลท์อยู่

    นั่นคือ เลขหน้าจะต่อเนื่องจาก Section ก่อนหน้า ให้เลือกเมนูนี้อีกครั้ง เพื่อเอาการ Link กับ Section ก่อนหน้าออก

    จากนั้นลบเลขหน้าที่หน้าที่ 2 ออก จากนั้นไปที่เมนู Page Number -> Format Page Number เพื่อทำการเลือกรูปแบบตัวเลขที่ต้องการใส่ใหม่ ในที่นี้ต้องการใส่เลขหน้าเป็นตัวอักษรภาษาไทย

    เมื่อพบหน้าต่าง Page Number Format ให้ทำการเลือกรูปแบบเลขหน้าที่ Number format จากนั้น ที่ Page numbering ในเลือกเป็น Start at โปรแกรม Word จะเลือกค่าโดยปริยายเป็น “ก” มาให้

    จากนั้นกด OK ผู้อ่านลองเลือกแผ่นกระดาษดูจะพบว่า เลขหน้าได้ทำการเปลี่ยนให้เป็นที่เรียบร้อย

    ผู้เขียนหวังว่าเนื้อหาเรื่องนี้จะเป็นประโยชน์ต่อผู้อ่านไม่มากก็น้อย ขอบคุณค่ะ 😀😍

  • แสดงข้อมูล Memory CPU Disk ด้วย C# EP.3

    แล้วก็มาถึง EP สุดท้ายของซีรีส์นี้ นั่นก็คือการดึงข้อมูลการใช้งานพื้นที่บน Disk

    ก่อนจะไปหาพื้นที่ disk เราต้องไปหา drive กันก่อนว่ามี drive อะไรบ้าง จากนั้นจึงไปหาข้อมูล disk ของ drive นั้นๆ โดยเราจะใช้ class DriveInfo สำหรับดึงข้อมูล drive ต่างๆ ออกมา ดังโค้ดตัวอย่าง

    โดยเราสามารถดึงข้อมูล drive ต่างๆ ได้ผ่านเมทธอด GetDrives() และเข้าถึงชื่อ drive ได้ผ่าน property Name

    เมื่อมาถึงขั้นตอนนี้ เราก็สามารถเข้าถึงข้อมูลพื้นที่ disk และการใช้งานของแต่ละ drive ได้ไม่ยากแล้ว ผ่าน property ต่างๆ ของ object DriveInfo เราไปดูตัวอย่างโค้ดกันเลย

    จากตัวอย่าง เราต้องตรวจสอบเพิ่มเติมว่า Drive ที่เราต้องการอยู่ในสถานะพร้อมใช้งานอยู่หรือไม่ผ่าน IsReady ก่อนที่จะเรียกใช้งานเมทธอดอื่น

    เพื่อให้การแสดงผลข้อมูลอยู่ในรูปแบบที่เข้าใจง่าย และแปลงรูปแบบข้อมูลให้เป็น GB ก็จะได้ตัวอย่างโค้ดทั้งหมดดังต่อไปนี้

    using System;
    using System.IO;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                long B2GB = 1024 * 1024 * 1024;
                DriveInfo[] drives = DriveInfo.GetDrives();
                foreach (DriveInfo drive in drives)
                {
                    if (drive.IsReady)
                    {
                        
                        Console.WriteLine("Drive : " + drive.Name);
                        Console.WriteLine("Total Size : " + (drive.TotalSize / B2GB ).ToString("0.00") + " GB" );
                        Console.WriteLine("Available Free Space : " + (drive.AvailableFreeSpace / B2GB).ToString("0.00") + " GB");
                    }
                }
            }
        }
    }
    

    ผลลัพธ์จากการรันโค้ดข้างต้น

    นอกจากนี้ DriveInfo ยังมีอีกหลาย property ที่เราสามารถเรียกใช้งานได้ ดังตัวอย่าง

    DriveInfo Properties
    AvailableFreeSpace Indicates the amount of available free space on a drive, in bytes.
    DriveFormat Gets the name of the file system, such as NTFS or FAT32.
    DriveType Gets the drive type, such as CD-ROM, removable, network, or fixed.
    IsReady Gets a value that indicates whether a drive is ready.
    Name Gets the name of a drive, such as C:.
    RootDirectory Gets the root directory of a drive.
    TotalFreeSpace Gets the total amount of free space available on a drive, in bytes.
    TotalSize Gets the total size of storage space on a drive, in bytes.
    VolumeLabel Gets or sets the volume label of a drive.

    สำหรับบทความในซีรี่ส์นี้ก็ขอจบแต่เพียงเท่านี้ หวังว่าจะมีประโยชน์บ้างไม่มากก็น้อย พบกันใหม่เมื่อมีเรื่องอยากจะเขียน

    สวัสดีครับ


    อ้างอิง

  • JavaScript : ไม่ควรใช้ For Loop ใน Arrays

    เชื่อว่า Programmer/Developer JavaScript ล้วนเคยผ่านการใช้งาน For Loops ในการ Coding กันมาแล้ว จำเป็นที่คุณต้องเลือกใช้มันให้เหมาะกับแต่ละสถานการณ์ แนะนำว่า ไม่ควรใช้ For Loop ใน Arrays แต่ขอแนะนำให้ใช้ .forEach() Method แทน

    .forEach() Method คืออะไร

    .forEach()  เป็น Built-in Method ใน Array Class ซึ่งได้รับการเปิดตัวใน ECMAScript 2015 (หรือที่เรียกกันว่า ES6) โดย Method จะทำการ Callback เป็น Arguments และเพื่อไม่ให้เกิดปัญหาขึ้น Callback จะเป็น Function ที่ถูก Execute สำหรับทุก item ใน Array

    ตัวอย่าง เพื่อแสดงถึงการใช้งานพื้นฐานของ .forEach() Method เรามาเริ่มด้วยการ Define Array ของ Integer แล้ว Print ค่าที่เป็น ยกกำลัง2 ของพวกมันลงใน Console

    let nums = [1,2,3,4,5];
    
    nums.forEach(function(n) {
       console.log(n * 2); 
    });
    
    // 2, 4, ุ6, 8, 10

    การเพิ่ม Index เข้าไป

    เราได้ทำการเพิ่ม Optional Parameter ตัวที่ 2 เข้าไปใน Function Definition ของเรา

    let nums = [1,2,3,4,5];
    
    nums.forEach(function(n,i) {
       console.log("i: " + n * 2);
    });
    /*
      0: 2
      1: 4
      2: 6
      3: 8
      4: 10
    */

    การจัดเก็บค่าด้วย .forEach()

    แล้วถ้าเราไม่ต้องการที่จะ Print ทุกอย่าง แต่อยากเก็บ Result ไว้ในตัวแปรใหม่ล่ะ? จะเห็นว่า .forEach() Method ไม่มีการ Return ใด ๆ กลับมาให้ ซึ่งการใช้ .map() Method ดูจะเป็นคำตอบที่ดีที่สุดในสถานการณ์นี้ แต่อย่างไรก็ตาม หากต้องการใช้ .forEach() เราสามารถเขียน Code ใหม่ได้ดังนี้

    let nums = [1,2,3,4,5];
    let result = [];
    nums.forEach(function(n) {
       result.push(n*2);
    });
    console.log(result); 
    
    // [2,4,6,8,10];

    การเขียน Callback Function สั้นกระชับขึ้น

    หากต้องการทำให้ Code สั้นกระชับมากขึ้น สามารถเขียนได้ดังนี้

    let nums = [1,2,3,4,5];
    
    nums.forEach((n) => {
       console.log(n *2);
    });
    

    หรือแบบนี้ก็ได้เช่นเดียวกัน

    let nums = [1,2,3,4,5];
    
    nums.forEach(n => console.log(n *2));

    อ้างอิง : https://medium.com/better-programming/stop-using-for-loops-to-iterate-over-arrays-5c46940e79d1