javascript - variable - Copie um array em Angular 2+TypeScript




javascript para angular (8)

A única solução que encontrei (quase instantaneamente depois de postar a pergunta) é percorrer o array e usar Object.assign()

Como isso:

public duplicateArray() {
  let arr = [];
  this.content.forEach((x) => {
    arr.push(Object.assign({}, x));
  })
  arr.map((x) => {x.status = DEFAULT});
  return this.content.concat(arr);
}

Eu sei que isso não é o ideal. E eu me pergunto se há soluções melhores.

Eu tenho uma matriz de objetos que é uma entrada. Vamos chamá-lo de content .

Ao tentar copiá-lo em profundidade, ele ainda tem uma referência ao array anterior.

Eu preciso duplicar essa matriz de entrada e alterar uma propriedade da parte duplicada.

Tanto tempo eu tentei métodos diferentes que não foram bem sucedidos.

Maneira ES6:

public duplicateArray() {
  arr = [...this.content]
  arr.map((x) => {x.status = DEFAULT});
  return this.content.concat(arr);
}

O caminho da slice :

public duplicateArray() {
  arr = this.content.slice(0);
  arr.map((x) => {x.status = DEFAULT});
  return this.content.concat(arr);
}

Em ambos, todos os objetos dentro da matriz possuem status: 'Default' .

Qual é a melhor abordagem para copiar profundamente o array em Angular 2?


Aqui é meu. Não funciona para casos complexos, mas para uma simples matriz de objetos, é bom o suficiente.

  deepClone(oldArray: Object[]) {
    let newArray: any = [];
    oldArray.forEach((item) => {
      newArray.push(Object.assign({}, item));
    });
    return newArray;
  }


Isso está funcionando para mim:

this.listCopy = Object.assign([], this.list);

Uma maneira limpa de copiar profundamente objetos com objetos aninhados é usando o método cloneDeep do lodash.

Para Angular, você pode fazer assim:

Instale o lodash com lodash yarn add lodash ou npm install lodash .

Em seu componente, importe cloneDeep e use-o:

import * as cloneDeep from 'lodash/cloneDeep';
...
clonedObject = cloneDeep(originalObject);

É apenas 18kb adicionado à sua construção, vale a pena pelos benefícios.

Eu também escrevi um artigo aqui , se você precisar de mais informações sobre o uso do cloneDeep do lodash.


Verifique isso:

  let cloned = source.map(x => Object.assign({}, x));

let newArr = arr.slice();

É assim que nos arrays JS são copiados. Não precisa pensar em algo novo!


let originalArray :string[]  = ['one', 'two', 'Sc-fi'];
let cloneArray :string[]  = originalArray.concat([]);






angular