Se eu clonar um array, uso cloneArr = arr.slice()
Eu quero saber como clonar um objeto em nodejs.
javascript
node.js
guilin 桂林
fonte
fonte
newObj = obj.clone(args...);
Object.assign não foi mencionado em nenhuma das respostas acima.
Se você estiver no ES6, pode usar o operador de propagação:
Referência: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
fonte
let a = {x:1}; let b = Object.assign({}, a); a.x = 2; a.y = 1; console.log(a, b);
Existem alguns módulos Node lá fora, se você não quiser "lançar o seu próprio". Este parece 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
É difícil fazer uma operação de clonagem genérica, mas útil, porque o que deve ser clonado recursivamente e o que deve ser apenas copiado depende de como o objeto específico deve funcionar.
Algo que pode ser útil é
Neste código, a lógica é
null
ouundefined
apenas retornar o mesmo (o caso especial é necessário porque é um erro tentar ver se umclone
método está presente)clone
método? então use issoEsta função de clone deve permitir a implementação de métodos de clone personalizados facilmente ... por exemplo
Quando no objeto você sabe que uma operação de clonagem correta para um array específico é apenas uma cópia superficial, você pode chamar em
values.slice()
vez declone(values)
.Por exemplo, no código acima, estou exigindo explicitamente que a clonagem de um objeto de polígono clonará os pontos, mas compartilhará o mesmo objeto de estilo. Se eu quiser clonar o objeto de estilo também, posso simplesmente passar
clone(this.style)
.fonte
.clone
métodos próprios. Esta é a melhor maneira de lidar com a clonagem de objetos.if (x.clone)
deveria serif (typeof x.clone === 'function')
Não existe um método nativo para clonar objetos. Implementos sublinhados,
_.clone
que é um clone raso.Ele o corta ou o estende.
Aqui está
_.extend
Extend simplesmente itera por todos os itens e cria um novo objeto com os itens nele.
Você pode lançar sua própria implementação ingênua se quiser
Existem boas razões para evitar a clonagem profunda, pois os fechamentos não podem ser clonados.
Eu pessoalmente fiz uma pergunta sobre
deep cloning objects before
e a conclusão a que cheguei é que você simplesmente não faz isso.Minha recomendação é usar
underscore
e seu_.clone
método para clones rasosfonte
Para uma cópia superficial, gosto de usar o padrão de redução (geralmente em um módulo ou algo assim), assim:
Aqui está um jsperf para algumas das opções: http://jsperf.com/shallow-copying
fonte
Pergunta antiga, mas há uma resposta mais elegante do que a que foi sugerida até agora; use os utils._extend integrados:
Observe o uso do primeiro parâmetro com um objeto vazio {} - isso diz a extend que o (s) objeto (s) copiado (s) precisam ser copiados para um novo objeto. Se você usar um objeto existente como o primeiro parâmetro, o segundo (e todos os subsequentes) parâmetros serão copiados para mesclagem profunda sobre a primeira variável de parâmetro.
Usando as variáveis de exemplo acima, você também pode fazer isso:
Utilitário muito útil, especialmente onde estou acostumado a estender em AngularJS e jQuery.
Espero que isso ajude outra pessoa; as sobregravações de referência de objeto são uma miséria e isso sempre resolve o problema!
fonte
Você também pode usar o lodash . Possui métodos clone e cloneDeep .
fonte
Dependendo do que você deseja fazer com seu objeto clonado, você pode utilizar o mecanismo de herança prototípico de javascript e obter um objeto clonado através de:
Lembre-se de que este não é um clone completo - para o bem ou para o mal.
Uma coisa boa sobre isso é que você realmente não duplicou o objeto, então a área de cobertura da memória será baixa.
No entanto, algumas coisas difíceis de lembrar sobre este método são que a iteração de propriedades definidas na cadeia de protótipos às vezes funciona um pouco diferente e o fato de que quaisquer alterações no objeto original afetarão o objeto clonado também, a menos que essa propriedade também tenha sido definida em si mesma .
fonte
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";
É preciso estar ciente de que as alterações no objeto original serão refletidas no "clone" e que as alterações no "clone" não serão refletidas no objeto original - mas não o chamaria de perigoso - tudo depende do que você quer fazer com seu cloneImplementei uma cópia profunda completa. Acredito que seja a melhor escolha para um método de clone genérico, mas não lida com referências cíclicas.
Exemplo de uso:
O próprio código:
Este código copia objetos com seus protótipos, ele também copia funções (pode ser útil para alguém).
Com esta cópia não consigo encontrar nenhuma diferença entre o original e o copiado exceto se o original utilizou fechos na sua construção, por isso penso que é uma boa implementação.
Espero que ajude
fonte
para array, pode-se usar
arr = arr.slice (0);
fonte
Objetos e matrizes em JavaScript usam chamada por referência, se você atualizar o valor copiado, ele pode refletir no objeto original. Para evitar isso, você pode clonar profundamente o objeto, para evitar que a referência seja passada, usando o comando run do método cloneDeep da biblioteca lodash
fonte