Array.prototype.reverse
invierte el contenido de una matriz en su lugar (con mutación) ...
¿Existe una estrategia similarmente simple para revertir una matriz sin alterar el contenido de la matriz original (sin mutación)?
Array.prototype.reverse
invierte el contenido de una matriz en su lugar (con mutación) ...
¿Existe una estrategia similarmente simple para revertir una matriz sin alterar el contenido de la matriz original (sin mutación)?
Respuestas:
Puede utilizar slice () para hacer una copia a continuación inversa () se
var newarray = array.slice().reverse();
If begin is omitted, slice begins from index 0.
- entonces es lo mismo quearray.slice(0)
En ES6:
const newArray = [...array].reverse()
[...].reverse
una ventaja en un caso de prueba muy simple. jsperf.com/reverse-vs-slice-reverse/1
.slice
significativamente más rápido.
slice
es probable que sea más rápido porque b / c [...]
es un genérico iterable a matriz, por lo que no puede hacer tantas suposiciones. Además, es probable que slice
esté mejor optimizado b / c que haya existido durante mucho tiempo.
Otra variante ES6:
También podemos usar .reduceRight()
para crear una matriz invertida sin realmente invertirla.
let A = ['a', 'b', 'c', 'd', 'e', 'f'];
let B = A.reduceRight((a, c) => (a.push(c), a), []);
console.log(B);
Recursos utiles:
reduceRight
es lento af
(a, c) => a.concat([c])
se siente más idiomático que(a, c) => (a.push(c), a)
Prueba esta solución recursiva:
const reverse = ([head, ...tail]) =>
tail.length === 0
? [head] // Base case -- cannot reverse a single element.
: [...reverse(tail), head] // Recursive case
reverse([1]); // [1]
reverse([1,2,3]); // [3,2,1]
reverse('hello').join(''); // 'olleh' -- Strings too!
Una alternativa ES6 usando .reduce()
y difundiendo.
const foo = [1, 2, 3, 4];
const bar = foo.reduce((acc, b) => ([b, ...acc]), []);
Básicamente, lo que hace es crear una nueva matriz con el siguiente elemento en foo y distribuir la matriz acumulada para cada iteración después de b.
[]
[1] => [1]
[2, ...[1]] => [2, 1]
[3, ...[2, 1]] => [3, 2, 1]
[4, ...[3, 2, 1]] => [4, 3, 2, 1]
Alternativamente, .reduceRight()
como se mencionó anteriormente aquí, pero sin la .push()
mutación.
const baz = foo.reduceRight((acc, b) => ([...acc, b]), []);
Hay varias formas de invertir una matriz sin modificarla. Dos de ellos son
var array = [1,2,3,4,5,6,7,8,9,10];
// Using Splice
var reverseArray1 = array.splice().reverse(); // Fastest
// Using spread operator
var reverseArray2 = [...array].reverse();
// Using for loop
var reverseArray3 = [];
for(var i = array.length-1; i>=0; i--) {
reverseArray.push(array[i]);
}
Prueba de rendimiento http://jsben.ch/guftu
EN Javascript simple:
function reverseArray(arr, num) {
var newArray = [];
for (let i = num; i <= arr.length - 1; i++) {
newArray.push(arr[i]);
}
return newArray;
}
Invertir en su lugar con intercambio variable solo con fines demostrativos (pero necesita una copia si no desea mutar)
const myArr = ["a", "b", "c", "d"];
const copy = [...myArr];
for (let i = 0; i < (copy.length - 1) / 2; i++) {
const lastIndex = copy.length - 1 - i;
[copy[i], copy[lastIndex]] = [copy[lastIndex], copy[i]]
}
es6:
const reverseArr = [1,2,3,4].sort(()=>1)
1
al final podría haber sido algo mayor que cero, porque así es como funciona la Array.prototype.sort
devolución de llamada (o así llamada compare function
). Básicamente, siempre se comparan 2 números y en este caso la comparación siempre es positiva, por lo que siempre se pasa al segundo número delante del primero :) esto es muy explicativo: stackoverflow.com/questions/6567941/…
sort()
muta la matriz (es decir, la ordena en su lugar), que es lo que el OP quiere evitar.