J'essaye d'inverser un tableau mais sans la fonction reverse
.
Comme vous le voyez, j'essaye de décrémenter la longueur du tableau num = (tab.length-i) - 1
, donc ça marche. Mais quand j'essaye d'ajouter tab [i] = tab [num]
, cela fonctionne mais la valeur push à l'intérieur de tab [i]
est aléatoire [10, 9 , 8, 7, 6, 6, 7, 8, 9, 10]
.
Avez-vous une idée de pourquoi?
const tab=[1,2,3,4,5,6,7,8,9,10] let num=0 for(let i=0;i<tab.length;i++){ num=(tab.length-i)-1 console.log(num) tab[i]=tab[num] }
p>
3 Réponses :
Vous devez utiliser une variable temporaire. Sans cela, vous écrasez simplement des valeurs comme ça.
let tab = [1,2,3,4,5,6,7,8,9,10], temp = []; // Create temp let num=0 for(let i=0;i<tab.length;i++){ num=(tab.length-i)-1 temp[i]=tab[num] // Add to temp } tab = temp; // Assign temp to tab console.log(tab)
Faites-le plutôt comme ceci:
Step 01: 1,2,3,4,5,6,7,8,9,10 Step 02: 10,2,3,4,5,6,7,8,9,10 Step 03: 10,9,3,4,5,6,7,8,9,10 Step 04: 10,9,8,4,5,6,7,8,9,10 Step 05: 10,9,8,7,5,6,7,8,9,10 Step 06: 10,9,8,7,6,6,7,8,9,10 // Now it will just take the values, but they are the same, so you are left with a mirrored array. Step 07: 10,9,8,7,6,6,7,8,9,10 Step 08: 10,9,8,7,6,6,7,8,9,10 Step 09: 10,9,8,7,6,6,7,8,9,10 Step 10: 10,9,8,7,6,6,7,8,9,10
le problème est que vous modifiez le tableau en même temps que vous le regardez, donc lorsque vous arrivez à l'élément du milieu, il a déjà été modifié.
voici une exécution manuelle de votre script:
XXX
Je pense que vous pouvez voir le problème ici
il y a 2 façons de résoudre ce problème:
// either create a temp array to keep previous values const reverseWithTmpArray = arr => { let tmp = [...arr] for(let i = 0; i < arr.length; i++){ let num = (arr.length - i) - 1 arr[i] = tmp[num] } return arr } // or reverse the element by pairs const reverseByPairs = arr => { for(let i = 0; i < arr.length / 2; i++){ let num = (arr.length - i) - 1 let tmp = arr[i] arr[i] = arr[num] arr[num] = tmp // can also be written // [arr[i], arr[num]] = [arr[num], arr[i]] // using destructuring assignement } return arr } console.log(reverseWithTmpArray([1,2,3,4,5,6,7,8,9,10])) console.log(reverseByPairs([1,2,3,4,5,6,7,8,9,10]))
Au fur et à mesure que je les ai écrites, ces 2 fonctions mutent le tableau d'entrée, il peut être réécrit pour éviter cet effet secondaire
var tab = [1,2,3,4,5,6,7,8,9,10, 11]; console.log("Before reverse:", tab); for (var k = 0; k < parseInt(tab.length/2); k++) { var reverseIndex = (tab.length - 1) - k; var tmp = tab[reverseIndex]; tab[reverseIndex] = tab[k]; tab[k] = tmp; } console.log("After reverse:", tab);
Vous écrasez les valeurs sans les enregistrer, le tableau se retrouve donc symétrique autour du point central
Pourquoi n'utilisez-vous pas un tableau temporaire comme tampon?
Pourquoi éviter le
reverse
? Vous pouvez d'abord cloner le tableau si vous souhaitez éviter de modifier le tableau d'origine. Par exemple.tab.slice (0) .reverse ()
.