Si je clone un tableau, j'utilise cloneArr = arr.slice()
Je veux savoir comment cloner un objet dans nodejs.
javascript
node.js
guilin 桂林
la source
la source
newObj = obj.clone(args...);
Object.assign n'a été mentionné dans aucune des réponses ci-dessus.
Si vous êtes sur ES6, vous pouvez utiliser l'opérateur de diffusion:
Référence: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
la source
let a = {x:1}; let b = Object.assign({}, a); a.x = 2; a.y = 1; console.log(a, b);
Il y a quelques modules Node là-bas si vous ne voulez pas "rouler vous-même". Celui-ci a l'air bien: https://www.npmjs.com/package/clone
On dirait qu'il gère toutes sortes de choses, y compris les références circulaires. Depuis la page github :
la source
Il est difficile de faire une opération de clonage générique mais utile car ce qui doit être cloné récursivement et ce qui doit être simplement copié dépend de la façon dont l'objet spécifique est censé fonctionner.
Quelque chose qui peut être utile est
Dans ce code, la logique est
null
ouundefined
retournez simplement le même (le cas particulier est nécessaire car c'est une erreur d'essayer de voir si unclone
méthode est présente)clone
méthode? alors utilise çaCette fonction de clonage devrait permettre d'implémenter facilement des méthodes de clonage personnalisées ... par exemple
Lorsque dans l'objet vous savez qu'une opération de clonage correcte pour un tableau spécifique n'est qu'une copie superficielle, vous pouvez appeler
values.slice()
au lieu declone(values)
.Par exemple, dans le code ci-dessus, je demande explicitement qu'un clonage d'un objet polygonal clonera les points, mais partagera le même objet de style. Si je veux aussi cloner l'objet de style à la place, je peux simplement passer
clone(this.style)
.la source
.clone
méthode eux-mêmes. C'est la meilleure façon de gérer le clonage d'objets.if (x.clone)
devrait êtreif (typeof x.clone === 'function')
Il n'existe pas de méthode native pour cloner des objets. Underscore implements
_.clone
qui est un clone superficiel.Il le tranche ou le prolonge.
Voici
_.extend
Extend itère simplement à travers tous les éléments et crée un nouvel objet avec les éléments qu'il contient.
Vous pouvez déployer votre propre implémentation naïve si vous le souhaitez
Il y a de bonnes raisons d'éviter le clonage profond car les fermetures ne peuvent pas être clonées.
J'ai personnellement posé une question
deep cloning objects before
et la conclusion à laquelle je suis arrivé est que vous ne le faites tout simplement pas.Ma recommandation est l'utilisation
underscore
et sa_.clone
méthode pour les clones peu profondsla source
Pour une copie superficielle, j'aime utiliser le modèle de réduction (généralement dans un module ou autre), comme ceci:
Voici un jsperf pour quelques options: http://jsperf.com/shallow-copying
la source
Ancienne question, mais il y a une réponse plus élégante que ce qui a été suggéré jusqu'à présent; utilisez les utils._extend intégrés:
Notez l'utilisation du premier paramètre avec un objet vide {} - cela indique à extend que le ou les objets copiés doivent être copiés dans un nouvel objet. Si vous utilisez un objet existant comme premier paramètre, le second (et tous les suivants) paramètres seront copiés en profondeur sur la première variable de paramètre.
En utilisant les exemples de variables ci-dessus, vous pouvez également faire ceci:
Utilitaire très pratique, en particulier là où je suis habitué à étendre AngularJS et jQuery.
J'espère que ceci aide quelqu'un d'autre; les écrasements de références d'objets sont une misère, et cela le résout à chaque fois!
la source
Vous pouvez également utiliser lodash . Il a une méthode clone et cloneDeep .
la source
En fonction de ce que vous voulez faire avec votre objet cloné, vous pouvez utiliser le mécanisme d'héritage prototypique de javascript et obtenir un objet quelque peu cloné via:
N'oubliez pas que ce n'est pas un clone complet - pour le meilleur ou pour le pire.
Une bonne chose à ce sujet est que vous n'avez en fait pas dupliqué l'objet, donc l'empreinte mémoire sera faible.
Certaines choses difficiles à retenir à propos de cette méthode sont que l'itération des propriétés définies dans la chaîne de prototypes fonctionne parfois un peu différemment et le fait que toute modification apportée à l'objet d'origine affectera également l'objet cloné à moins que cette propriété n'ait également été définie sur elle-même. .
la source
var a = {foo: "bar"}, b = Object.create(a); a.foo = "broken"; console.log(b.foo); // "broken";
b.foo = "working"; console.log(a.foo); // still "broken";
Il faut bien sûr être conscient que les modifications de l'objet d'origine seront reflétées dans le "clone" et que les modifications du "clone" ne seront pas reflétées dans l'objet d'origine - mais je n'appellerais pas cela dangereux - tout dépend de ce que vous voulez faire avec votre cloneJ'ai implémenté une copie complète complète. Je pense que c'est le meilleur choix pour une méthode de clonage générique, mais elle ne gère pas les références cycliques.
Exemple d'utilisation:
Le code lui-même:
Ce code copie les objets avec leurs prototypes, il copie également des fonctions (peut être utile pour quelqu'un).
Avec cette copie, je ne trouve aucune différence entre l'original et le copié, sauf si l'original a utilisé des fermetures sur sa construction, donc je pense que c'est une bonne mise en œuvre.
J'espère que ça aide
la source
pour le tableau, on peut utiliser
arr = arr.slice (0);
la source
Les objets et les tableaux en JavaScript utilisent l'appel par référence, si vous mettez à jour la valeur copiée, cela peut se refléter sur l'objet d'origine. Pour éviter cela, vous pouvez cloner l'objet en profondeur, pour empêcher la transmission de la référence, à l'aide de la commande d' exécution de la méthode cloneDeep de la bibliothèque lodash
la source