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()
[...].reverseuna ventaja en un caso de prueba muy simple. jsperf.com/reverse-vs-slice-reverse/1
.slicesignificativamente más rápido.
slicees 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 sliceesté 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:
reduceRightes 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)
1al final podría haber sido algo mayor que cero, porque así es como funciona la Array.prototype.sortdevolució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.