Ghi chú của biên tập viên. Bài đăng này đã được cập nhật vào ngày 23 tháng 3 năm 2022 để bao gồm thông tin cập nhật về sao chép các đối tượng trong JavaScript và TypeScript, bao gồm cả kỹ thuật sao chép có cấu trúc
Khi làm việc với lập trình hàm, một nguyên tắc nhỏ là luôn tạo đối tượng mới thay vì thay đổi đối tượng cũ. Khi làm như vậy, chúng ta có thể chắc chắn rằng việc can thiệp vào cấu trúc của đối tượng sẽ không ảnh hưởng đến một số phần dường như không liên quan của ứng dụng, điều này sẽ làm cho toàn bộ mã dễ đoán hơn
Chính xác thì làm thế nào chúng ta có thể chắc chắn rằng những thay đổi chúng ta thực hiện đối với một đối tượng không ảnh hưởng đến mã ở nơi khác? . Để thoát khỏi một tham chiếu, chúng ta cần sao chép tất cả các thuộc tính của đối tượng sang một đối tượng mới. Trong bài viết này, chúng ta sẽ xem xét năm kỹ thuật mà chúng ta có thể sử dụng để sao chép các đối tượng trong JavaScript, cũng như thời điểm sử dụng từng kỹ thuật. Nếu có thể, chúng tôi cũng sẽ trình bày cách sử dụng từng kỹ thuật để sao chép các đối tượng trong TypeScript. TypeScript về cơ bản là một tập hợp con của JavaScript với kiểu gõ tĩnh, nhưng nó là tùy chọn ưa thích của một số nhà phát triển. So với JavaScript, Typescript thường dễ đọc, dễ hiểu và gỡ lỗi hơn
Dưới đây là năm phương pháp sao chép JavaScript mà chúng tôi sẽ xem xét
- Bản sao nông
- Bản sao sâu
- chỉ định
- Hợp nhất với toán tử trải rộng hoặc hàm
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]
5 - nhân bản có cấu trúc
Bản sao nông
Một bản sao nông của một đối tượng sẽ có cùng tham chiếu với đối tượng nguồn mà từ đó bản sao được tạo. Do đó, khi chúng tôi sửa đổi nguồn hoặc bản sao, chúng tôi cũng có thể làm cho đối tượng khác thay đổi. Nói cách khác, chúng tôi có thể vô tình tạo ra những thay đổi không mong muốn trong nguồn hoặc bản sao. Điều quan trọng là phải nắm được sự khác biệt giữa việc sửa đổi có chọn lọc giá trị của thuộc tính dùng chung của một phần tử hiện có và gán một giá trị hoàn toàn mới cho một phần tử hiện có
JavaScript cung cấp các hoạt động sao chép đối tượng sẵn có tiêu chuẩn để tạo các bản sao nông.
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]6,
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]7,
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]8,
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]5, và
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]0,
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]1
Đây là một ví dụ về bản sao nông trong JavaScript
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_copy = Array.from[profile]; profile_copy[1].language = ["Igbo","Yoruba"] console.log[JSON.stringify[profile]]; // ["Bruce",{"language":["Igbo","Yoruba"]}] profile_copy[0] = "Pascal" console.log[profile[0]] // Bruce console.log[JSON.stringify[profile_copy]]; // ["Pascal",{"language":["Igbo","Yoruba"]}] console.log[JSON.stringify[profile]]; // ["Bruce",{"language":["Igbo","Yoruba"]}]
Đây là một ví dụ về bản sao nông trong TypeScript. Trong ví dụ này, chúng tôi sao chép đối tượng bằng cách sử dụng toán tử trải rộng [_______52]
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]
Đây là một ví dụ khác về bản sao nông trong TypeScript. Trong ví dụ này, chúng tôi tạo một đối tượng mới và sao chép mọi thuộc tính từ đối tượng
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]3
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]
Khi nào nên sử dụng bản sao nông
Bản sao nông có thể được sử dụng khi chúng ta xử lý một đối tượng chỉ có các thuộc tính với kiểu dữ liệu nguyên thủy [ví dụ: chuỗi hoặc số]. Nếu đối tượng của chúng tôi chứa các loại dữ liệu không nguyên thủy [ví dụ: hàm hoặc mảng], nó có thể làm gián đoạn chương trình của chúng tôi
Bản sao sâu
Bản sao sâu của một đối tượng sẽ có các thuộc tính không chia sẻ cùng tham chiếu với đối tượng nguồn mà từ đó bản sao được tạo. Kết quả là, chúng ta có thể thay đổi nguồn hoặc bản sao mà không thay đổi đối tượng khác. Nói cách khác, thực hiện thay đổi đối với một đối tượng sẽ không gây ra những thay đổi bất ngờ đối với nguồn hoặc bản sao.
Để tạo các bản sao sâu trong JavaScript, chúng tôi sử dụng các phương thức
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]4 và
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]5. Đầu tiên, chúng tôi chuyển đổi đối tượng thành chuỗi JSON bằng hàm
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]4. Sau đó, chúng tôi phân tích cú pháp chuỗi bằng phương thức
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]5 để tạo một đối tượng JavaScript mới
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]
Bây giờ, hãy xem cách tạo một bản sao sâu của một đối tượng trong TypeScript
Ví dụ đầu tiên của chúng tôi hoạt động theo cách đệ quy. Chúng ta viết một hàm
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]8, hàm này kiểm tra loại đối số được gửi tới nó và gọi một hàm thích hợp cho đối số [nếu đó là một mảng hoặc một đối tượng] hoặc chỉ trả về giá trị của đối số [nếu nó không phải là một mảng
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]8
Hàm
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]9 lấy tất cả các khóa của một đối tượng và lặp lại chúng, gọi đệ quy hàm
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]8 cho mỗi giá trị
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]1
Vì vậy,
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]81 lặp lại mảng được cung cấp, gọi
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]8 cho mọi giá trị trong đó
Hơn 200 nghìn nhà phát triển sử dụng LogRocket để tạo ra trải nghiệm kỹ thuật số tốt hơn
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]4
Bây giờ, hãy xem một ví dụ TypeScript khác theo một cách tiếp cận khác. Mục tiêu của chúng ta là tạo một đối tượng mới mà không có bất kỳ tham chiếu nào đến đối tượng trước đó, phải không? . Những gì chúng tôi nhận được là một đối tượng mới hoàn toàn không biết về nguồn gốc của nó
Điều quan trọng cần lưu ý là trong ví dụ trước, các phương thức của đối tượng được giữ lại, nhưng ở đây chúng không. Vì định dạng
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]83 không hỗ trợ các hàm nên chúng bị xóa hoàn toàn
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]9
Khi nào nên sử dụng bản sao sâu
Bản sao sâu có thể được sử dụng khi đối tượng của bạn chứa cả kiểu dữ liệu nguyên thủy và không nguyên thủy. Nó cũng có thể được sử dụng bất cứ lúc nào bạn cảm thấy cần cập nhật các đối tượng hoặc mảng lồng nhau
chỉ định
Hàm
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]5 có thể được sử dụng để sao chép tất cả vô số thuộc tính riêng từ một hoặc nhiều đối tượng nguồn sang đối tượng đích. Hàm này trả về đối tượng đích cho biến
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]88
Đây là một ví dụ về sao chép bằng hàm
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]5 trong JavaScript
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]3
Đây là một ví dụ về sao chép bằng cách chỉ định trong TypeScript. Ở đây, chúng tôi chỉ cần lấy từng đối tượng
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]3 và sao chép các thuộc tính của nó sang
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]11, mà chúng tôi thường chuyển thành
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]12 để ngăn chặn đột biến
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]7
Đây là một ví dụ khác về sao chép bằng cách chỉ định trong TypeScript. Ví dụ này là một phiên bản an toàn, trong đó, thay vì thay đổi đối tượng
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]11, chúng tôi tạo một đối tượng hoàn toàn mới mà sau này chúng tôi gán cho một biến. Điều này có nghĩa là chúng ta không cần phải vượt qua đối số
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]11. Thật không may, phiên bản này không hoạt động với từ khóa
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]15 vì không thể chỉ định lại
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]15
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]0
Khi nào sử dụng gán
Hàm
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]5 có thể được sử dụng để sao chép một đối tượng không bị sửa đổi và gán một số thuộc tính mới cho một đối tượng hiện có. Trong mã mẫu ở trên, chúng tôi đã tạo một đối tượng trống,
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]12, được gọi là
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]11 và gán các thuộc tính từ đối tượng
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]3
Các bài viết hay khác từ LogRocket
- Đừng bỏ lỡ một khoảnh khắc nào với The Replay, một bản tin được tuyển chọn từ LogRocket
- Tìm hiểu cách Galileo của LogRocket loại bỏ tiếng ồn để chủ động giải quyết các sự cố trong ứng dụng của bạn
- Sử dụng useEffect của React để tối ưu hóa hiệu suất ứng dụng của bạn
- Chuyển đổi giữa nhiều phiên bản của Node
- Khám phá cách tạo hoạt ảnh cho ứng dụng React của bạn với AnimXYZ
- Khám phá Tauri, một khuôn khổ mới để xây dựng các tệp nhị phân
- So sánh NestJS với. Thể hiện. js
sáp nhập
Phương thức hợp nhất tương tự như phương thức gán, nhưng thay vì thay đổi các thuộc tính trong mục tiêu, nó nối chúng lại với nhau. Nếu một giá trị là một mảng hoặc một đối tượng, hàm này sẽ hợp nhất các thuộc tính theo cách đệ quy. Có hai cách để hợp nhất các đối tượng trong JavaScript. sử dụng toán tử trải rộng hoặc phương pháp
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]5
Toán tử trải rộng
Toán tử trải rộng,
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]42, đã được triển khai trong ES6 và có thể được sử dụng để hợp nhất hai hoặc nhiều đối tượng thành một đối tượng mới sẽ có các thuộc tính của các đối tượng đã hợp nhất. Nếu hai đối tượng có cùng tên thuộc tính, thuộc tính đối tượng sau sẽ ghi đè lên đối tượng trước
Đây là một ví dụ về việc hợp nhất với toán tử trải rộng trong JavaScript
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]1
Bây giờ, hãy xem một ví dụ về hợp nhất trong TypeScript
Hàm
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]43 chấp nhận hai đối số.
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]11 và
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]3. Nếu cả hai giá trị đều là đối tượng, chúng tôi gọi và trả về
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]46 với
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]11 và
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]3 đã nói ở trên làm đối số. Tương tự, khi cả hai giá trị đều là mảng, chúng ta gọi và trả về
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]49. Nếu
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]3 là
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]91, chúng tôi chỉ giữ bất kỳ giá trị nào trước đó, điều đó có nghĩa là chúng tôi trả về đối số
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]11. Nếu không có điều nào ở trên áp dụng, chúng tôi chỉ trả về đối số
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]3
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]2
Cả
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]49 và
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]46 đều hoạt động theo cùng một cách. chúng tôi lấy các thuộc tính của
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]3 và đặt chúng dưới cùng một khóa trong
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]11
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]3
Bây giờ tất cả những gì còn lại phải làm là tạo một hàm TypeScript
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]98
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]4
phương pháp function shallow[source: T]: T {
const copy = {} as T
Object.keys[source].forEach[[key] => {
copy[key as keyof T] = source[key as keyof T]
}]
return copy
}
let profile = {
"name": "Pascal",
"age": 23
}
const employee: {} = shallow[profile]
console.log[employee]
5
Phương thức
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]5 có thể được sử dụng để hợp nhất hai đối tượng và sao chép kết quả sang mục tiêu mới. Cũng giống như toán tử trải phổ, nếu các đối tượng nguồn có tên thuộc tính giống nhau thì đối tượng sau sẽ thay thế đối tượng trước
Đây là một ví dụ
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]5
Bây giờ, hãy xem một ví dụ khác về việc hợp nhất trong Typescript. Với cách tiếp cận này, trước tiên chúng tôi muốn lấy tất cả các thuộc tính của đối tượng
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]3 , ngay cả khi chúng được lồng sâu ba đối tượng , và lưu một
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]32 vào các thuộc tính. Điều này sau này sẽ cho phép chúng tôi đặt giá trị tại đường dẫn thích hợp bên trong đối tượng
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]11
Một
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]32 là một mảng các chuỗi trông giống như thế này.
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]35
Đây là một ví dụ về cách thức hoạt động của nó
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]6
Chúng tôi gọi hàm
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]36 để lấy một mảng các đối tượng chứa đường dẫn và giá trị của các thuộc tính. Nếu đối số
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]37 là
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]38 hoặc không giống như đối tượng, chúng tôi không thể đi sâu hơn nữa vì vậy chúng tôi trả về một đối tượng chứa đối số
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]37 và đường dẫn của nó
Mặt khác, nếu đối số giống như đối tượng và không phải là
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]38, thì chúng ta có thể chắc chắn rằng đó là một mảng hoặc một đối tượng. Nếu nó là một mảng, chúng ta gọi
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]71. Nếu nó là một đối tượng , chúng ta gọi ______372
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]7
Cả
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]71 và
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]72 đều lặp lại các thuộc tính gọi tên
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]36 cho mỗi thuộc tính với
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]76/
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]77 hiện tại được thêm vào
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]32
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]8
Sau khi nhận được các đường dẫn và giá trị của toàn bộ đối tượng
let profile = ["Bruce",{"language":["English","Spanish","French"]}]; let profile_deep_copy = JSON.parse[JSON.stringify[profile]]; // Change the value of the 'language' property profile_deep_copy[1].language = ["Ibo","Yoruba"] // The 'language' property does not change in profile. console.log[profile[1].language]; //[ "English", "Spanish", "French" ]3, chúng ta có thể thấy rằng chúng được lồng sâu vào nhau. Tuy nhiên, chúng tôi muốn giữ tất cả chúng trong một mảng duy nhất. Điều này có nghĩa là chúng ta cần
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]00 mảng
Làm phẳng một mảng để lặp lại từng mục để kiểm tra xem đó có phải là một mảng không. Nếu là chúng tôi
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]00 nó và sau đó
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]02 giá trị cho mảng kết quả
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]9
Bây giờ chúng ta đã tìm hiểu cách lấy
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]32, hãy xem xét cách đặt tất cả các thuộc tính này trong đối tượng
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]11
Hãy nói về hàm
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]05 mà chúng ta sẽ sử dụng để đặt các giá trị tại các đường dẫn tương ứng của chúng. Chúng tôi muốn có quyền truy cập vào thuộc tính cuối cùng của đường dẫn để đặt giá trị. Để làm như vậy, chúng ta cần xem qua các mục của đường dẫn, tên thuộc tính của nó và mỗi lần lấy giá trị của thuộc tính.
Chúng ta bắt đầu hàm
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]06 với đối tượng đích mà sau đó có sẵn dưới dạng đối số
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]07.
Mỗi lần chúng tôi trả về giá trị bên dưới
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]08, nó sẽ trở thành đối số
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]07 trong lần lặp tiếp theo. Bằng cách này, khi chúng ta đến mục cuối cùng của đường dẫn, đối số
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]07 là đối tượng hoặc mảng nơi chúng ta đặt giá trị
Trong ví dụ của chúng tôi, đối số
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]07, cho mỗi lần lặp, sẽ là.
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]11 ->
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]13 ->
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]14
Chúng ta phải nhớ rằng
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]11 có thể là một đối tượng trống trong khi các nguồn có thể sâu ở nhiều cấp độ. Điều này có nghĩa là chúng ta có thể phải tự tạo lại cấu trúc của một đối tượng hoặc một mảng trước khi đặt giá trị
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]0
Chúng tôi đặt giá trị ở mục cuối cùng của
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]32 và trả về đối tượng mà chúng tôi đã bắt đầu
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]1
Nếu bên trong
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]13 không có
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]14, chúng tôi sẽ nhận được
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]91 và sau đó là lỗi nếu chúng tôi cố gắng đặt
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]20. Để ngăn chặn điều này, trước tiên chúng tôi kiểm tra xem có tồn tại
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]08 không. Nếu nó không tồn tại, chúng ta sẽ cần tạo nó dưới dạng một đối tượng hoặc dưới dạng một mảng. Nếu loại của mục tiếp theo là
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]22 [thực tế là một chỉ mục], thì chúng ta sẽ cần tạo một mảng. Nếu nó là một chuỗi, chúng ta sẽ tạo một đối tượng
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]2
Bây giờ, tất cả những gì còn lại phải làm là tạo hàm
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]98 liên kết mọi thứ lại với nhau
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]3
Khi nào nên sử dụng hợp nhất
Hợp nhất các đối tượng không phải là một phương pháp điển hình trong JavaScript, nhưng phương pháp này cho phép chúng ta kết hợp các thuộc tính của đối tượng, ngay cả với các đối tượng được lồng rất sâu
nhân bản có cấu trúc
Nhân bản có cấu trúc là một kỹ thuật mới để sao chép các đối tượng trong JavaScript. Đó là một phương pháp toàn cầu sử dụng thuật toán sao chép có cấu trúc để tạo một bản sao sâu của một mục được chỉ định. Thay vì nhân bản các đối tượng, nó chuyển các đối tượng từ nguồn ban đầu của chúng sang một nguồn mới, nơi chúng không còn có thể truy cập được trong nguồn ban đầu
Kỹ thuật này có thể được sử dụng với các đối tượng có thể chuyển nhượng, là một loại đối tượng sở hữu tài nguyên. Các đối tượng này chỉ có thể được chuyển bằng cách sử dụng giá trị chuyển của tham số ban đầu. Do chuyển giao, đối tượng ban đầu sẽ không thể sử dụng được
Trong ví dụ dưới đây, mã sẽ chuyển
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]24 từ giá trị được truyền vào, nhưng không chuyển
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]25
function shallow[source: T]: T { const copy = {} as T Object.keys[source].forEach[[key] => { copy[key as keyof T] = source[key as keyof T] }] return copy } let profile = { "name": "Pascal", "age": 23 } const employee: {} = shallow[profile] console.log[employee]4
Khi nào nên sử dụng nhân bản có cấu trúc
Nhân bản có cấu trúc có thể hữu ích cho các trường hợp khi bạn cần xác thực dữ liệu không đồng bộ trong bộ đệm trước khi lưu dữ liệu. Để tránh bộ đệm bị sửa đổi trước khi lưu dữ liệu, bạn có thể sao chép bộ đệm và xác thực dữ liệu đó. Kỹ thuật này cũng có thể hữu ích nếu bạn đang truyền dữ liệu. Với nhân bản có cấu trúc, mọi nỗ lực sửa đổi bộ đệm ban đầu sẽ không thành công, ngăn chặn việc vô tình sử dụng sai bộ đệm
Phần kết luận
Trong bài viết này, chúng ta đã thảo luận về 5 kỹ thuật hữu ích để sao chép một đối tượng trong JavaScript cũng như TypeScript. Chúng tôi sử dụng bản sao nông khi xử lý một đối tượng chỉ có các thuộc tính với kiểu dữ liệu nguyên thủy [chuỗi hoặc số]. Sao chép sâu đảm bảo rằng không có tham chiếu đến đối tượng nguồn hoặc bất kỳ thuộc tính nào của nó. Gán là một cách tuyệt vời để sao chép một đối tượng hoặc chỉ để gán một số thuộc tính mới cho một đối tượng hiện có. Hợp nhất cho phép chúng tôi hợp nhất các thuộc tính của các đối tượng, ngay cả khi các đối tượng được lồng sâu. Cuối cùng, nhân bản có cấu trúc cho phép chúng tôi xác thực không đồng bộ và dữ liệu đối tượng
function shallow[source: T]: T { return { ...source, } } let profile = { "name": "Pascal", "age": 12 } const employee: {} = shallow[profile] console.log[employee]26, sau đó hiển thị đối tượng ban đầu không sử dụng được
Đối tượng là phương thức cơ bản để chúng ta tổ chức và truyền dữ liệu trong JavaScript. Chúng được thể hiện trong TypeScript thông qua các loại đối tượng [______927]. Cho dù bạn chọn sao chép các đối tượng bằng JavaScript hay TypeScript, hy vọng rằng hướng dẫn này đã cung cấp cho bạn các tùy chọn để xem xét cho nhiều trường hợp sử dụng. Nếu bạn đã quen thuộc với các kỹ thuật sao chép đối tượng khác trong JavaScript, vui lòng chia sẻ chúng trong phần nhận xét
Nhật KýTên Lửa. Gỡ lỗi JavaScript dễ dàng hơn bằng cách hiểu ngữ cảnh
Gỡ lỗi mã luôn là một công việc tẻ nhạt. Nhưng bạn càng hiểu lỗi của mình thì càng dễ sửa chúng
LogRocket cho phép bạn hiểu những lỗi này theo những cách mới và độc đáo. Giải pháp giám sát giao diện người dùng của chúng tôi theo dõi mức độ tương tác của người dùng với giao diện người dùng JavaScript của bạn để cung cấp cho bạn khả năng tìm ra chính xác những gì người dùng đã làm dẫn đến lỗi
LogRocket ghi nhật ký bảng điều khiển, thời gian tải trang, dấu vết ngăn xếp, yêu cầu/phản hồi mạng chậm với tiêu đề + nội dung, siêu dữ liệu trình duyệt và nhật ký tùy chỉnh. Hiểu tác động của mã JavaScript của bạn sẽ không bao giờ dễ dàng hơn thế