1
votes

Comment inverser un tableau en JavaScript sans Array.prototype.reverse?

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 commentaires

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


3 Réponses :


0
votes

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


0 commentaires

2
votes

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

doc d'assignation de déstructuration


0 commentaires

0
votes

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);


0 commentaires