ค้นหาเว็บไซต์

javascript - การคัดลอกอาเรย์แบบลึกใน Angular 2 + TypeScript


ฉันมีอาเรย์ของวัตถุซึ่งเป็นข้อมูลนำเข้า ให้เรียกมันว่า content

เมื่อพยายามคัดลอกเชิงลึก มันยังคงมีการอ้างอิงถึงอาเรย์ก่อนหน้าอยู่

ฉันจำเป็นต้องทำสำเนาอาร์เรย์อินพุตนั้น และเปลี่ยนคุณสมบัติหนึ่งของส่วนที่ทำสำเนา

นานมาแล้วที่ฉันได้ลองวิธีต่างๆ แต่ก็ไม่ประสบความสำเร็จ

วิธี ES6:

public duplicateArray() {
  arr = [...this.content]
  arr.map((x) => {x.status = DEFAULT});
  return this.content.concat(arr);
}

วิธี slice:

public duplicateArray() {
  arr = this.content.slice(0);
  arr.map((x) => {x.status = DEFAULT});
  return this.content.concat(arr);
}

ในทั้งสองนั้น วัตถุทั้งหมดภายในอาร์เรย์มี status: 'Default'

วิธีที่ดีที่สุดในการคัดลอกอาร์เรย์แบบลึกใน Angular 2 คืออะไร?

คำตอบ #1

ตรวจสอบนี่:

  let cloned = source.map(x => Object.assign({}, x));

คำตอบ #2

ง่าย

let objCopy  = JSON.parse(JSON.stringify(obj));

นี่ก็ใช้ได้เช่นกัน (เฉพาะกับอาเรย์)

let objCopy2 = obj.slice()

คำตอบ #3

นี่คือข้อเสนอของ Daria (ดูความคิดเห็นในคำถาม) ซึ่งใช้งานได้ตั้งแต่ TypeScript 2.1 และโดยพื้นฐานจะโคลนแต่ละองค์ประกอบจากอาร์เรย์:

this.clonedArray = theArray.map(e => ({ ... e }));

คำตอบ #4

นี่กำลังใช้ได้ผลสำหรับฉัน:

this.listCopy = Object.assign([], this.list);

คำตอบ #5

วิธีแก้ปัญหาเพียงอย่างเดียวที่ฉันพบ (เกือบจะทันทีหลังจากโพสต์คำถาม) คือการวนลูปผ่านอาร์เรย์และใช้ Object.assign()

แบบนี้:

public duplicateArray() {
  let arr = [];
  this.content.forEach((x) => {
    arr.push(Object.assign({}, x));
  })
  arr.map((x) => {x.status = DEFAULT});
  return this.content.concat(arr);
}

ฉันรู้ว่านี่ไม่ใช่วิธีที่ดีที่สุด และฉันสงสัยว่ามีวิธีแก้ปัญหาที่ดีกว่านี้หรือไม่

คำตอบ #6

วิธีที่สะอาดในการคัดลอกวัตถุอย่างลึกที่มีวัตถุซ้อนอยู่ข้างในคือการใช้เมทอด cloneDeep ของ lodash

สำหรับ Angular คุณสามารถทำได้แบบนี้:

ติดตั้ง lodash ด้วย yarn add lodash หรือ npm install lodash

ในคอมโพเนนต์ของคุณ นำเข้า cloneDeep และใช้งานมัน:

import * as cloneDeep from 'lodash/cloneDeep';
...
clonedObject = cloneDeep(originalObject);

มันเพิ่มเพียง 18KB ให้กับการสร้างของคุณ คุ้มค่ากับประโยชน์ที่ได้รับ

ฉันยังได้เขียนบทความไว้ที่นี่ด้วย หากคุณต้องการมุมมองเพิ่มเติมเกี่ยวกับเหตุผลในการใช้ cloneDeep ของ lodash

บทความที่เกี่ยวข้อง