Array.prototype.reverse
inverse le contenu d'un tableau en place (avec mutation) ...
Existe-t-il une stratégie tout aussi simple pour inverser un tableau sans modifier le contenu du tableau d'origine (sans mutation)?
javascript
arrays
sfletche
la source
la source
Réponses:
Vous pouvez utiliser slice () pour faire une copie puis inverse () il
var newarray = array.slice().reverse();
Afficher l'extrait de code
var array = ['a', 'b', 'c', 'd', 'e']; var newarray = array.slice().reverse(); console.log('a', array); console.log('na', newarray);
la source
If begin is omitted, slice begins from index 0.
- c'est donc la même chose quearray.slice(0)
Dans ES6:
const newArray = [...array].reverse()
la source
.slice
aussi beaucoup plus rapide.slice
sera probablement plus rapide b / c[...]
est un tableau générique itérable donc ne peut pas faire autant de suppositions. De plus, il est probable que ceslice
soit mieux optimisé car cela existe depuis longtemps.Une autre variante ES6:
Nous pouvons également utiliser
.reduceRight()
pour créer un tableau inversé sans réellement l'inverser.let A = ['a', 'b', 'c', 'd', 'e', 'f']; let B = A.reduceRight((a, c) => (a.push(c), a), []); console.log(B);
Ressources utiles:
Array.prototype.reduceRight()
Arrow Functions
Comma Operator
la source
reduceRight
is slow af(a, c) => a.concat([c])
se sent plus idiomatique que(a, c) => (a.push(c), a)
Essayez cette solution récursive:
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!
la source
Une alternative ES6 utilisant
.reduce()
et épandant .const foo = [1, 2, 3, 4]; const bar = foo.reduce((acc, b) => ([b, ...acc]), []);
Fondamentalement, il crée un nouveau tableau avec l'élément suivant dans foo, et répartit le tableau accumulé pour chaque itération après b.
[] [1] => [1] [2, ...[1]] => [2, 1] [3, ...[2, 1]] => [3, 2, 1] [4, ...[3, 2, 1]] => [4, 3, 2, 1]
Alternativement
.reduceRight()
comme mentionné ci-dessus ici, mais sans la.push()
mutation.const baz = foo.reduceRight((acc, b) => ([...acc, b]), []);
la source
Il existe plusieurs façons d'inverser un tableau sans le modifier. Deux d'entre eux sont
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]); }
Test de performance http://jsben.ch/guftu
la source
EN Javascript brut:
function reverseArray(arr, num) { var newArray = []; for (let i = num; i <= arr.length - 1; i++) { newArray.push(arr[i]); } return newArray; }
la source
Inverser en place avec échange de variables juste à des fins de démonstration (mais vous avez besoin d'une copie si vous ne voulez pas muter)
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]] }
la source
es6:
const reverseArr = [1,2,3,4].sort(()=>1)
la source
1
à la fin aurait pu être supérieur à zéro, car c'est ainsi que fonctionne leArray.prototype.sort
rappel (ou ainsi appelécompare function
). En gros, vous comparez toujours 2 nombres et dans ce cas, la comparaison retourne toujours positive, donc il est dit de toujours passer au deuxième nombre devant le premier :) c'est très explicatif: stackoverflow.com/questions/6567941sort()
mute le tableau (c'est-à-dire le trie sur place), ce que l'OP veut éviter.