Vamos supor que eu queria uma função de classificação que retorne uma cópia classificada da matriz inserida. Eu tentei ingenuamente isso
function sort(arr) {
return arr.sort();
}
e eu testei com isso, o que mostra que meu sort
método está alterando a matriz.
var a = [2,3,7,5,3,7,1,3,4];
sort(a);
alert(a); //alerts "1,2,3,3,3,4,5,7,7"
Eu também tentei essa abordagem
function sort(arr) {
return Array.prototype.sort(arr);
}
mas não funciona.
Existe uma maneira simples de contornar isso, preferencialmente uma maneira que não exija a rolagem manual do meu próprio algoritmo de classificação ou a cópia de todos os elementos da matriz para um novo?
javascript
Peter Olson
fonte
fonte
.sort
requer que othis
valor seja a matriz, portanto, para o último trecho funcionar, você faria.sort.call(arr)
(embora isso não resolva o seu problema).Respostas:
Basta copiar a matriz. Há muitas maneiras de fazer isso:
fonte
concat
over sayslice(0)
ou todos eles são praticamente iguais?Array.prototype.slice.call(arr).sort();
invés dearr.slice().sort();
?Outra maneira com es6 (cópia não profunda):
a sintaxe de propagação como literal de matriz (copiada do mdn):
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator
fonte
Tente o seguinte
A
slice(0)
expressão cria uma cópia da matriz iniciando no elemento 0.fonte
Você pode usar fatia sem argumentos para copiar uma matriz:
fonte
Você também pode fazer isso
Dessa forma, d não será alterado.
fonte
Qualquer pessoa que queira fazer uma cópia profunda (por exemplo, se sua matriz contiver objetos) pode usar:
Então você pode classificar
arrCopy
sem alterararr
.Observe: isso pode ser lento para matrizes muito grandes.
fonte
-
vez de>
no seu segundo exemplo.Eu uso Object.assign () para a maioria das minhas cópias:
No entanto, depois de examinar os comentários do OP, pesquisei um pouco de cópia profunda e constatamos que o Object.assign não apenas executa uma cópia superficial, mas também seleciona apenas propriedades enumeráveis e próprias (conforme respondido neste post ).
fonte