Ποιος είναι ο πιο αποτελεσματικός τρόπος για να κλωνοποιήσετε βαθιά ένα αντικείμενο στη JavaScript;

Ποιος είναι ο πιο αποτελεσματικός τρόπος για να κλωνοποιήσετε ένα αντικείμενο JavaScript; Έχω δει να χρησιμοποιείται το obj = eval(uneval(o));, αλλά αυτό είναι μη τυποποιημένο και υποστηρίζεται μόνο από τον Firefox.

Έχω κάνει πράγματα όπως obj = JSON.parse(JSON.stringify(o)); αλλά αμφισβητώ την αποδοτικότητα.

Έχω δει επίσης αναδρομικές συναρτήσεις αντιγραφής με διάφορες ατέλειες. <br /&gt, Εκπλήσσομαι που δεν υπάρχει καμία κανονική λύση.

Λύση

Μητρική βαθιά κλωνοποίηση

Ονομάζεται "δομημένη κλωνοποίηση", λειτουργεί πειραματικά στο Node 11 και αργότερα, και ελπίζουμε ότι θα προσγειωθεί στα προγράμματα περιήγησης. Δείτε αυτή την απάντηση για περισσότερες λεπτομέρειες.

Γρήγορη κλωνοποίηση με απώλεια δεδομένων - JSON.parse/stringify

Αν δεν χρησιμοποιείτε Date, συναρτήσεις, undefined, Infinity, RegExps, Maps, Sets, Blobs, FileLists, ImageDatas, sparse Arrays, Typed Arrays ή άλλους πολύπλοκους τύπους μέσα στο αντικείμενό σας, μια πολύ απλή μονοσήμαντη λύση για τον βαθύ κλωνοποίηση ενός αντικειμένου είναι:

JSON.parse(JSON.stringify(object))

Σχόλια (24)

Αν δεν υπήρχε κάποιο ενσωματωμένο, μπορείτε να δοκιμάσετε:

function clone(obj) {
    if (obj === null || typeof (obj) !== 'object' || 'isActiveClone' in obj)
        return obj;

    if (obj instanceof Date)
        var temp = new obj.constructor(); //or new Date(obj);
    else
        var temp = obj.constructor();

    for (var key in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, key)) {
            obj['isActiveClone'] = null;
            temp[key] = clone(obj[key]);
            delete obj['isActiveClone'];
        }
    }
    return temp;
}
Σχόλια (11)
function clone(obj)
 { var clone = {};
   clone.prototype = obj.prototype;
   for (property in obj) clone[property] = obj[property];
   return clone;
 }
Σχόλια (5)