Resumo:
Array.from()
função, ele pega um iterável como na entrada e retorna uma matriz do iterável.
- Operador de propagação:
...
em combinação com um literal de matriz.
const map = new Map([[ 1, 'one' ],[ 2, 'two' ]]);
const newArr1 = [ ...map ];
const newArr2 = Array.from( map );
console.log(newArr1, newArr2);
Advertência ao copiar matrizes:
Esteja ciente do fato de que, por meio desses métodos acima, apenas uma cópia superficial é criada quando queremos copiar um array. Um exemplo irá esclarecer o problema potencial:
let arr = [1, 2, ['a', 'b']];
let newArr = [ ...arr ];
console.log(newArr);
arr[2][0] = 'change';
console.log(newArr);
Aqui, por causa do array aninhado, a referência é copiada e nenhum novo array é criado. Portanto, se alterarmos o array aninhado do array antigo, essa mudança será refletida no novo array (porque eles se referem ao mesmo array, a referência foi copiada).
Solução para advertência:
Podemos resolver o problema de ter cópias rasas criando um clone profundo do array usando JSON.parse(JSON.stringify(array))
. Por exemplo:
let arr = [1, 2, ['a', 'b']]
let newArr = Array.from(arr);
let deepCloneArr = JSON.parse(JSON.stringify(arr));
arr[2][0] = 'change';
console.log(newArr, deepCloneArr)
Array.from(iterable)
, consulte ECMA-262 ed 6 draft .