ejemplos - javascript html
¿Cómo se puede ordenar una matriz sin mutar la matriz original? (6)
Pruebe lo siguiente
function sortCopy(arr) {
return arr.slice(0).sort();
}
La expresión slice(0)
crea una copia de la matriz que comienza en el elemento 0.
Supongamos que quería una función de clasificación que devuelve una copia ordenada de la matriz ingresada. Intenté ingenuamente esto
function sort(arr) {
return arr.sort();
}
y lo probé con esto, lo que demuestra que mi método de sort
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.
¿Hay una manera directa de evitar esto, preferiblemente de una manera que no requiera laminar manualmente mi propio algoritmo de clasificación o copiar cada elemento de la matriz en uno nuevo?
Puede usar slice sin argumentos para copiar una matriz:
var foo,
bar;
foo = [3,1,2];
bar = foo.slice().sort();
Solo copie la matriz. Hay muchas formas de hacerlo:
function sort(arr) {
return arr.concat().sort();
}
// Or:
return Array.prototype.slice.call(arr).sort(); // For array-like objects
También puedes hacer esto
d = [20, 30, 10]
e = Array.from(d)
e.sort()
De esta forma, d no se mutará.
function sorted(arr) {
temp = Array.from(arr)
return temp.sort()
}
//Use it like this
x = [20, 10, 100]
console.log(sorted(x))
Uso Object.assign() para la mayoría de mis copias:
var copyArray = Object.assign([], originalArray).sort();
Sin embargo, después de revisar los comentarios de OP, investigué un poco de copia profunda y resultó que Object.assign no solo realiza una copia superficial, sino que solo selecciona propiedades enumerables y propias (como se responde en esta publicación ).
una solución un poco más limpia para no copia profunda con es6:
const sorted = [...arr].sort();
la sintaxis de extensión como una matriz literal (copiada de mdn):
var arr = [1, 2, 3];
var arr2 = [...arr]; // like arr.slice()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator