Hỏi cách clone hoàn toàn mảng object

Em có một mảng object :

const objArr = [{ a: 1 }, { b: 2 }];

Em muốn clone hoàn toàn objArr bỏ hết tham chiếu thì làm như nào ạ?

Nếu clone như này const clonedArr = [...objArr] thì sai vì cloneArr vẫn còn giữ tham chiếu đến ab.

Em dùng cách này:

const clonedArr = JSON.parse(JSON.stringify(objArr));

Dù sao vẫn đúng như ý muốn nhưng cảm giác nó như một trick, em muốn hỏi là có cách chính thống nào tối ưu không hoặc thư viện hỗ trợ sẵn cũng được.
Em cảm ơn.

4 Likes

hàm stringify JSON.stringify(objArr) convert objArr của bạn thành chuỗi string "[{ a: 1 }, { b: 2 }]", sau đó hàm parse() convert chuỗi string thành Javascript Object.

hai hàm này sẽ ko có vấn đề nếu object của bạn ko chứa value là 1 function. VD:

let myObj = { 
    sayHi() {
        return "Hi"
    }
};
JSON.parse(JSON.stringify(myObj )) // will not work

nên tùy thuộc vào mục đích, nếu obj của bạn bao gồm property-value là primitive type thì dùng JSON cũng được

5 Likes

Nhưng chuyển sang JSON string nó chậm hơn dùng thư viện lodash á bạn.

https://www.measurethat.net/Benchmarks/Show/3291/0/object-deep-copy

1 Like

thử với mấy link so sánh khác giữa lodash với json trên trang đó thử bạn, có mấy dataset khác kết quả khác ấy, mình ko rõ lắm. Trong link của anh Situ có 1 comment mention json performance tốt hơn lodash

xài lodash thì cần cài thêm dependency, nếu obj đáp ứng đủ điều kiện của json thì mình thấy ko cần thiết cài thêm thôi

If you do not use Date s, functions, undefined , Infinity , [NaN], RegExps, Maps, Sets, Blobs, FileLists, ImageDatas, sparse Arrays, Typed Arrays or other complex types, a very simple one liner to deep clone an object is JSON.parse(JSON.stringify(o)))

5 Likes

mình thấy cách dùng json này cũng rất tốt nhé

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?