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 ().