Qual é a melhor maneira de clonar um objeto no node.js
por exemplo, quero evitar a situação em que:
var obj1 = {x: 5, y:5};
var obj2 = obj1;
obj2.x = 6;
console.log(obj1.x); // logs 6
O objeto pode muito bem conter tipos complexos como atributos, portanto, um simples para (var x in obj1) não seria resolvido. Preciso escrever um clone recursivo ou há algo embutido que não estou vendo?
javascript
node.js
desleixado
fonte
fonte
npm install underscore
2.var _ = require('underscore')
3_.clone(objToClone)
.;Respostas:
Possibilidade 1
Cópia profunda com baixo custo:
Possibilidade 2 (descontinuada)
Atenção: Esta solução agora está marcada como descontinuada na documentação do Node.js :
Resposta original ::
Para uma cópia superficial, use a função interna do Node
util._extend()
.O código fonte da
_extend
função do Node está aqui: https://github.com/joyent/node/blob/master/lib/util.jsfonte
_*
deveria significar que é um método privado e não deve ser invocado?util._extend()
método nunca foi projetado para ser usado fora dos módulos internos do Node.js. A comunidade encontrou e usou de qualquer maneira. Ele foi descontinuado e não deve ser usado no novo código. JavaScript vem com muito semelhante funcionalidade interna atravésObject.assign().
Estou surpreso
Object.assign
não ter sido mencionado.Se disponível (por exemplo, Babel), você pode usar o operador de propagação de objetos :
fonte
Isso definirá um método de extensão que você pode usar. O código vem deste artigo.
fonte
fonte
Object.keys()
para percorrer objetoVocê pode usar a função de extensão do JQuery:
Também existe um plug-in do Node.js.
https://github.com/shimondoodkin/nodejs-clone-extend
Para fazer isso sem JQuery ou Plugin, leia isso aqui:
http://my.opera.com/GreyWyvern/blog/show.dml/1725165
fonte
Confira underscore.js . Possui clone e extensão e muitas outras funções muito úteis.
Isso pode ser útil: Usando o módulo Underscore com Node.js
fonte
Existem alguns módulos de nó por aí, se você não quiser "rodar sozinho". Este parece ser bom: https://www.npmjs.com/package/clone
Parece que ele lida com todos os tipos de coisas, incluindo referências circulares. Na página do github :
fonte
Esse código também é uma causa de trabalho. O método Object.create () cria um novo objeto com o objeto e as propriedades do protótipo especificado.
fonte
A maneira mais simples e rápida de clonar um objeto no NodeJS é usar o método Object.keys (obj)
O método Object.keys requer JavaScript 1.8.5; O nodeJS v0.4.11 suporta este método
mas é claro que para objetos aninhados precisam implementar funções recursivas
Outra solução é usar JSON nativo (implementado no JavaScript 1.7), mas é muito mais lento (~ 10 vezes mais lento) que o anterior
fonte
Há também um projeto no Github que visa ser uma porta mais direta do
jQuery.extend()
:https://github.com/dreamerslab/node.extend
Um exemplo, modificado a partir dos documentos do jQuery :
fonte
Existe outra biblioteca lodash , que tem clone e cloneDeep , também muitas outras funções úteis.
fonte
Vocês estão sofrendo e a solução é simples.
var obj2 = {...obj1};
// Estrondofonte
Procurando por uma verdadeira opção de clone, deparei-me com o link do ridcully aqui:
http://my.opera.com/GreyWyvern/blog/show.dml/1725165
Modifiquei a solução nessa página para que a função anexada ao
Object
protótipo não seja enumerável. Aqui está o meu resultado:Espero que isso ajude outra pessoa também. Observe que existem algumas advertências ... particularmente com propriedades denominadas "clone". Isto funciona bem para mim. Não aceito nenhum crédito por escrevê-lo. Mais uma vez, mudei apenas como estava sendo definido.
fonte
Você também pode usar o SugarJS no NodeJS.
http://sugarjs.com/
Eles têm um recurso de clone muito limpo: http://sugarjs.com/api/Object/clone
fonte
Se você estiver usando script de café, é tão fácil quanto:
Embora este não seja um clone profundo.
fonte
Nenhuma das respostas me satisfez, várias não funcionam ou são apenas clones superficiais, as respostas do @ clint-harris e do uso do JSON.parse / stringify são boas, mas bem lentas. Encontrei um módulo que faz clonagem profunda rápida: https://github.com/AlexeyKupershtokh/node-v8-clone
fonte
Não há uma maneira integrada de fazer um clone real (cópia detalhada) de um objeto no node.js. Existem alguns casos complicados, então você definitivamente deve usar uma biblioteca para isso. Eu escrevi essa função para minha biblioteca simpleoo . Você pode usar o
deepCopy
função sem usar mais nada da biblioteca (que é bem pequena) se não precisar. Essa função suporta a clonagem de vários tipos de dados, incluindo matrizes, datas e expressões regulares, suporta referências recursivas e também trabalha com objetos cujas funções construtoras possuem parâmetros necessários.Aqui está o código:
fonte
Clonador mais rápido, ele abre o método clone nativo do node.js
fonte
Outra solução é encapsular diretamente na nova variável usando:
obj1= {...obj2}
fonte
Você também pode usar esta biblioteca de clones para clonar objetos profundamente.
fonte
Você pode criar um protótipo de objeto e, em seguida, chamar a instância do objeto sempre que desejar usar e alterar o objeto:
Você também pode passar argumentos para o construtor de objetos
Espero que isso seja útil.
fonte