Deep clone object in JavaScript

18 Oct 2018

Share to:

สวัสดีครับ ไม่ได้เขียน Blog มานาน วันนี้เอาซะหน่อยเป็นเรื่องสั้นๆที่เกี่ยวกับการ Clone object ใน Javascript

ปกติ Object ใน Javascript จะเป็น Referent type หมายความว่า เมื่อเราสร้าง Object ขึ้นมา มันจะสร้าง Reference variable ไว้ใน Stack memory และใช้ Variable ที่เราประกาศ ชี้ไปยัง data ที่อยู่ในหน่วยความจำส่วนของ Heap memory อีกที

เพื่อความเข้าใจมาดูตัวอย่างนี้ครับ

val obj1 = {
  counter: 1
}

val obj2 = obj1

obj2.counter++

// Output "Counter in obj1 is: 2"
console.log("Counter in obj1 is: " + obj1.counter)

จากตัวอย่าง จะเห็นว่า obj1 และ Obj2 ชี้ไปยัง Object เดียวกัน ทําให้เมื่อเปลี่ยนแปลงข้อมูลที่อยู่ใน obj2 ส่งผลให้ obj1 เปลี่ยนแปลงตามไปด้วย

ถ้าหากว่าถ้าเราต้องการจะ Clone object ละ จะทําอย่างไร?

ในบทความนี้ผมจะเสนอวิธีการ Clone สองวิธีดังนี้

Clone object แบบที่1 ใช้ JSON.parse และ JSON.stringify

const deepClone = (obj) => {
  return JSON.parse(JSON.stringify(obj));
};

let testObject = {
  counter: 1,
};

let newObject = deepClone(testObject);

newObject.counter++;

console.log('testObject data is ' + testObject.counter);
console.log('newObject data is ' + newObject.counter);

ลองรัน Code ได้ที่นี่ es6console.com/jnenhefu/

การทํางานคือจะแปลง Object เป็น Json String ก่อน แล้วก็แปลงกลับ เป็น Object อีกครั้ง

Clone object แบบที่2

const deepClone = (obj, output = Array.isArray(obj) ? [...obj] : { ...obj }) => {
  Object.keys(obj).forEach((key) => {
    if (typeof obj[key] === 'object') {
      output[key] = Array.isArray(obj[key]) ? [...obj[key]] : { ...obj[key] };
      deepCopy(obj[key], output[key]);
    }
  });

  return output;
};

let testObject = {
  counter: 1,
};

let newObject = deepClone(testObject);

newObject.counter++;

console.log('testObject data is ' + testObject.counter);
console.log('newObject data is ' + newObject.counter);

ทดลองรันได้ที่นี่ jsfiddle.net/kr81zq67/3/

ทั้งสองแบบสามารถใช้งานได้เหมือนกัน แต่จะมีข้อแตกต่างคือ แบบที่1 จะไม่สามารถใช้กับ Object ที่มีข้อมูลเป็น Fuction ได้ ส่วนแบบที่2 สามารถใช้กับ Object ที่มีข้อมูลทุกประเภท

Suggestion blogs

เปลี่ยน port ssh เพื่อเพิ่มความปลอดภัย

วิธี เปลี่ยน port ของ ssh เพื่อเพิ่มความปลอดภัยให้กับ server

การใช้ usb wifi กับ Raspberry Pi

ในบทความนี้ ผมจะแนะนําการใช้ usb wifi กับ Raspberry Pi มาเริ่มกันเลยครับ ขั้นตอนแรกถ้าเราต้องการจะ Scan หาว่ามี wifi rounter ตัวไหนอยู่บริเวณนี้บ้าง ใช้คําสั่งนี้

วิธีการ ซื้อ-จองล่วงหน้า ลอตเตอรี่ให้ได้

หลังจากที่มีโครงการซื้อ-จองล่วงหน้าสลากกินแบ่งรัฐบาลเป็นรูปแบบการจัดสรรสลากกินแบ่งรัฐบาล ที่เปิดให้ซื้อ-จองผ่านช่องทางต่าง ๆ ของ ธนาคารกรุงไทย โดยการจองซื้อสลากสามารถทำได้ ทำได้ 3 ช่องทาง ช่องทางแรกคือไปพบพนักงานที่ธนาคารกรุงไทยเลย  ช่องทางที่สองคือผ่านเครื่อง ATM ของธนาคารกรุงไทย ซึ่งมี ATM ที่รองรับ 9000 เครื่องทั่วประเทศ และช่องทางที่สามคือ internet banking เมื่อเกิดโครงการนี้ขึ้นมา ปัญหาที่เกิดขึ้นคือ มีคนจํานวนไม่น้อยที่ไม่สามารถจองหรือซื้อสลากกินแบ่งรัฐบาลได้ เนื่องจากมีคนเข้าทํารายการจองหรือซื้อสลากกินแบ่งรัฐบาลเป็นจํานวนมาก (ช่วงแรกระบบถึงกับล่มเลยทีเดียว)


Copyright © 2019 - 2024 thiti.dev |  v1.39.0 |  Privacy policy | 

Build with ❤️ and Astro.

Github profile   Linkedin profile   Instagram   X profile   Youtube channel   Telegram   Email contact   วงแหวนเว็บ