Menu
CoddyTech

Sao chép nông và sâu

Thuộc phần Logic và luồng chương trình trong hành trình JavaScript của Coddy. Bài học 25 trên 65.

Khi sao chép đối tượng, ta có hai kiểu sao chép:

  1. Sao chép nông: chỉ sao chép cấp đầu tiên
  2. Sao chép sâu: sao chép tất cả các cấp lồng nhau

Các phương thức sao chép nông:

Dùng toán tử spread:

const original = { a: 1, b: { x: 2 } };
const spreadCopy = { ...original };

Dùng Object.assign() để tạo đối tượng mới bằng cách sao chép các thuộc tính từ đối tượng nguồn sang đối tượng đích:

const assignCopy = Object.assign({}, original);

Vấn đề với bản sao nông:

original.b.x = 3;
console.log(spreadCopy.b.x); // 3
// (các đối tượng lồng nhau dùng chung tham chiếu)

console.log(assignCopy.b.x); // 3

Tìm hiểu về phương thức JSON và sao chép sâu

JSON.stringify() chuyển đổi một đối tượng JavaScript thành chuỗi JSON:

const obj = { name: "John", age: 30 };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // "{"name":"John","age":30}"

JSON.parse() chuyển một chuỗi JSON trở lại thành một đối tượng JavaScript:

const backToObject = JSON.parse(jsonString);
console.log(backToObject); // { name: "John", age: 30 }

Sao chép sâu bằng JSON:

const original = { a: 1, b: { x: 2 } };
const deepCopy = JSON.parse(JSON.stringify(original));

original.b.x = 3;
console.log(deepCopy.b.x); // 2 (hoàn toàn độc lập)
challenge icon

Thử thách

Dễ

Tạo một hàm có tên processCart nhận một chuỗi JSON đại diện cho giỏ hàng. Giỏ hàng chứa một mảng sản phẩm có tên và giá. Nhiệm vụ của bạn là:

  1. Phân tích chuỗi JSON thành một đối tượng JavaScript
  2. Tạo HAI giỏ hàng riêng biệt từ chuỗi đó
  3. Trong giỏ hàng thứ hai:
    1. Thêm thuộc tính discounted vào mỗi mặt hàng và đặt giá trị là false
    2. Giảm giá 10% cho tất cả mặt hàng có price lớn hơn 50
    3. Đặt 'discounted' thành true cho những mặt hàng được giảm giá
  4. Trả về một mảng chứa cả hai giỏ hàng

Tự làm thử

function processCart(jsonString) {
    // Viết code ở đây
}
// Đừng viết gì bên ngoài hàm
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch JavaScript online