07Feb, 2020
ภาษา :
Thai
Share blog : 
07 February, 2020
Thai

จัดการ Array ด้วย Javascript (Clone Deep)

By

4 mins read
จัดการ Array ด้วย Javascript (Clone Deep)

ในปัจจุบันนี้ ปฏิเสธไม่ได้เลยว่าภาษาที่ถูกใช้ในการเขียนเว็บต่าง ๆ นั้น คงหนีไม่พ้นภาษา Javascript ซึ่งเป็นภาษาที่ถูกนำไปพัฒนาเป็น framework หรือ library ต่าง ๆ มากมาย 

ผู้พัฒนาหลายคนก็มีรูปแบบการเขียนภาษา Javascript ที่แตกต่างกัน เราเลยมีแนวทางการเขียนที่หลากหลาย มาแบ่งปันเพื่อน ๆ เกี่ยวกับการจัดการ Array ด้วยภาษา Javascript กัน เรามาดูตัวอย่างกันเลยดีกว่า

โดยปกติแล้วการ copy ค่าจาก value type ธรรมดา สามารถเขียนได้ดังนี้ let value = 3;

let valueCopy = value; // create copy
console.log(valueCopy); // 3
valueCopy = 100 // Change valueCopy
console.log(valueCopy); // 100// ✅ Original NOT affected 
console.log(value); // 3ซึ่งค่าของ value จะไม่เกิดผลกระทบเมื่อค่าที่ถูก copy ไปถูกเปลี่ยนแปลงแต่ การ copy ค่าจาก array type นั้นไม่เหมือนกับ value type ดังตัวอย่าง
let array = [1,2,3];
let arrayCopy = array; // create copy
console.log(arrayCopy); // [1,2,3];
arrayCopy[0] = '👻'; // Change 1st element of the array
console.log(arrayCopy); // [ '👻', 2, 3 ] // ❌Original got affected
console.log(array); // [ '👻', 2, 3 ] 

 

จะเห็นว่า ค่าของ original array นั้นถูกเปลี่ยนค่าด้วย เมื่อทำการ copy วิธีเดียวกับ value type เนื่องจาก สิ่งที่ copy มานั้น ไม่ใช่ค่า array แต่เป็น address ที่ถูกชี้ไปยังพื้นที่หน่วยความจำของ array ที่ใช้ เมื่อเราทำการ copy ค่ามา นั่นหมายถึงตัวแปรที่ copy มาจะมีพื้นที่หน่วยความจำเดียวกัน เมื่อค่าเปลี่ยน จึงทำให้ค่า origin array ถูกเปลี่ยนค่าด้วยทันที

วีธีการ clone  ค่าจาก array ที่ถูกต้อง

ดังนั้นวีธีการ clone หรือ copy ค่าจาก array ที่ถูกต้องนั้น สามารถเขียนง่าย ๆ ดังนี้let array = [1,2,3];

let arrayCopy = [...array]; // create TRUE copy
console.log(arrayCopy); // [1,2,3];
arrayCopy[0] = '👻'; // Change 1st element of the array
console.log(arrayCopy); // [ '👻', 2, 3 ] // ✅ Original NOT affected 
console.log(array); // [ 1, 2, 3 ] แต่ !!! การใช้ [...] spread operator ไม่สามารถใช้ได้ทุกกรณี สามารถใช้ได้ฉพาะ array ที่มี level เดียวเท่านั้น ยกตัวอย่างหากเป็น nestedArray ดังตัวอย่าง
let nestedArray = [1, [2], 3];
let arrayCopy = [...nestedArray3];// Make some changes
arrayCopy[0] = '👻'; // change shallow element
arrayCopy[1][0] = '💩'; // change nested element
console.log(arrayCopy); // [ '👻', [ '💩' ], 3 ]// ❌ Nested array got affected
console.log(nestedArray); // [ 1, [ '💩' ], 3 ] จะเห็นว่าค่าของ origin nestedArray ถูกเปลี่ยนแปลงค่าด้วยเช่นกัน ดังนั้นวิธีที่ปลอดภัยที่สุดมีดังนี้หากเป็น 
nestedArraylet nestedArray = [1, [2], 3];
let arrayCopy = JSON.parse(JSON.stringify(nestedArray));// Make some changes
arrayCopy[0] = '👻'; // change shallow element
arrayCopy[1][0] = '💩'; // change nested element
console.log(arrayCopy); // [ '👻', [ '💩' ], 3 ]// ✅ Nested array NOT affected
console.log(nestedArray); //  1, [ 2 ], 3 ]

 

ซึ่งวิธีนี้จะทำการเปลี่ยน array ให้เป็น string ด้วย JSON.stringify และเปลี่ยนกลับเป็น array อีกครั้งด้วย JSON.parse โดยจะได้ค่า array จริง ๆ แต่วิธีนี้จะไม่สามารถใช้ได้ทุกกรณีเช่นกันหาก array มีฟังก์ชัน หรือสัญลักษณ์ต่าง ๆ

ความต่างระหว่าง JSON.stringify / parse กับ deepClone

จึงทำให้วิธีการ JSON.stringify / parse กับ วิธีการ deepClone ด้วย library อื่นมาช่วย นั้นต่างกันดังนี้

  • JSON.stringify / parse ใช้ได้กับตัวอักษร Number และ String และ Object เท่านั้นโดยไม่มีฟังก์ชันหรือคุณสมบัติ Symbol
  • deepClone ทำงานกับทุกประเภทฟังก์ชั่นและสัญลักษณ์จะถูกคัดลอกโดย reference

วิธีที่ clone array แบบง่าย ๆ

จากตัวอย่างที่กล่าวไปข้างต้น เรามีวิธีที่ช่วย clone array ที่ง่ายและขึ้นอยู่กับการใช้งาน ดังนี้

1. ใช้ JSON.parse(JSON.stringify(array)) (ใช้ได้กับตัวอักษร Number และ String และ Object)

2. ใช้  library อื่น ๆ ที่ช่วยในการจัดการ array เช่น _.cloneDeep ของ library lodash เป็นต้น (ใช้ได้ทุกกรณี)

// How to deep clone array const numbers = [1, [2], [3,[4],5]] // Using javascript JSON.parse(JSON.stringify(numbers)) // Using lodash _.cloneDeep(numbers)

Original article:

Written by
Senna Labs
Senna Labs

Subscribe to follow product news, latest in technology, solutions, and updates

- More than 120,000 people/day visit to read our blogs

บทความอื่นๆ

15
November, 2024
JS class syntax
15 November, 2024
JS class syntax
เชื่อว่าหลายๆคนที่เขียน javascript กันมา คงต้องเคยสงสัยกันบ้าง ว่า class ที่อยู่ใน js เนี่ย มันคืออะไร แล้วมันมีหน้าที่ต่างกับการประกาศ function อย่างไร? เรามารู้จักกับ class ให้มากขึ้นกันดีกว่า class เปรียบเสมือนกับ blueprint หรือแบบพิมพ์เขียว ที่สามารถนำไปสร้างเป็นสิ่งของ( object ) ตาม blueprint หรือแบบพิมพ์เขียว( class ) นั้นๆได้ โดยภายใน class

By

4 mins read
Thai
15
November, 2024
15 สิ่งที่ทุกธุรกิจต้องรู้เกี่ยวกับ 5G
15 November, 2024
15 สิ่งที่ทุกธุรกิจต้องรู้เกี่ยวกับ 5G
ผู้ให้บริการเครือข่ายในสหรัฐฯ ได้เปิดตัว 5G ในหลายรูปแบบ และเช่นเดียวกับผู้ให้บริการเครือข่ายในยุโรปหลายราย แต่… 5G มันคืออะไร และทำไมเราต้องให้ความสนใจ บทความนี้ได้รวบรวม 15 สิ่งที่ทุกธุรกิจต้องรู้เกี่ยวกับ 5G เพราะเราปฏิเสธไม่ได้เลยว่ามันกำลังจะถูกใช้งานอย่างกว้างขวางขึ้น 1. 5G หรือ Fifth-Generation คือยุคใหม่ของเทคโนโลยีเครือข่ายไร้สายที่จะมาแทนที่ระบบ 4G ที่เราใช้อยู่ในปัจจุบัน ซึ่งมันไม่ได้ถูกจำกัดแค่มือถือเท่านั้น แต่รวมถึงอุปกรณ์ทุกชนิดที่เชื่อมต่ออินเตอร์เน็ตได้ 2. 5G คือการพัฒนา 3 ส่วนที่สำคัญที่จะนำมาสู่การเชื่อมต่ออุปกรณ์ไร้สายต่างๆ ขยายช่องสัญญาณขนาดใหญ่ขึ้นเพื่อเพิ่มความเร็วในการเชื่อมต่อ การตอบสนองที่รวดเร็วขึ้นในระยะเวลาที่น้อยลง ความสามารถในการเชื่อมต่ออุปกรณ์มากกว่า 1 ในเวลาเดียวกัน 3. สัญญาณ 5G นั้นแตกต่างจากระบบ

By

4 mins read
Thai
15
November, 2024
Software Architecture แบบไหนเหมาะกับธุรกิจของคุณ
15 November, 2024
Software Architecture แบบไหนเหมาะกับธุรกิจของคุณ
Monolith โปรแกรมเมอร์ส่วนใหญ่น่าจะรู้จักและเคยผ่านมากันเกือบทุกคน มันคือ Software Architechture รูปแบบหนึ่งที่มีการใช้ resource และ environment เดียวกันทั้งโปรเจค แต่การพัฒนาการสามารถแยกกัน หรือพัฒนาไปพร้อมกันระหว่าง Backend และ Frontend ขึ้นอยู่กับทีมว่าแบบไหนเหมาะ และเร็วกับทีม ข้อดี แน่นอนว่าเมื่อ software architechture มันมีการใช้งาน environment เดียวกันมันจึงช่วยให้ทีมที่พัฒนาสามารถใช้งาน library เดียวกันและ เมื่อมีการเปลี่ยนแปลงใดๆ ทีมก็จะได้ code base เดียวกัน ทำให้สามารถพัฒนา produdct

By

3 mins read
Thai

Let’s build digital products that are
simply awesome !

We will get back to you within 24 hours!ติดต่อเรา
Please tell us your ideas.
- Senna Labsmake it happy
Contact ball
Contact us bg 2
Contact us bg 4
Contact us bg 1
Ball leftBall rightBall leftBall right
Sennalabs gray logo28/11 Soi Ruamrudee, Lumphini, Pathumwan, Bangkok 10330+66 62 389 4599hello@sennalabs.com© 2022 Senna Labs Co., Ltd.All rights reserved.