Supongamos que quisiera una función de clasificación que devuelva una copia ordenada de la matriz ingresada. Intenté ingenuamente esto
function sort(arr) {
return arr.sort();
}
y lo probé con esto, lo que muestra que mi sort
método está mutando la 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"
También probé este enfoque
function sort(arr) {
return Array.prototype.sort(arr);
}
Pero no funciona en absoluto.
¿Existe una forma directa de evitar esto, preferiblemente una forma que no requiera mover manualmente mi propio algoritmo de clasificación o copiar cada elemento de la matriz en uno nuevo?
javascript
Peter Olson
fuente
fuente
.sort
requiere que elthis
valor sea la matriz, por lo que para que el último fragmento funcione funcionaría.sort.call(arr)
(aunque no resuelve su problema).Respuestas:
Simplemente copie la matriz. Hay muchas formas de hacer eso:
fuente
concat
sobre sayslice(0)
o son todos prácticamente iguales?Array.prototype.slice.call(arr).sort();
lugar dearr.slice().sort();
?Otra forma con es6 (copia no profunda):
La sintaxis de propagación como matriz literal (copiada de mdn):
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator
fuente
Intenta lo siguiente
La
slice(0)
expresión crea una copia de la matriz comenzando en el elemento 0.fuente
Puede usar el segmento sin argumentos para copiar una matriz:
fuente
También puedes hacer esto
De esta manera, d no será mutado.
fuente
Cualquier persona que quiera hacer una copia profunda (por ejemplo, si su matriz contiene objetos) puede usar:
Entonces puedes ordenar
arrCopy
sin cambiararr
.Tenga en cuenta: esto puede ser lento para matrices muy grandes.
fuente
-
lugar de>
en su segundo ejemplo.Yo uso Object.assign () para la mayoría de mis copias:
Sin embargo, después de mirar los comentarios de OP, investigué un poco de copia profunda y resultó que Object.assign no solo realiza una copia superficial, sino que también selecciona propiedades enumerables y propias (como se respondió en esta publicación ).
fuente