0
votes

Méthode qui prend un tableau et déplace tous les zéros à la fin, en préservant l'ordre des autres éléments

J'essaie de comprendre pourquoi cette partie - arr.splice (index, 1) .push (0) - de mon code ne fonctionne pas. pourquoi ne puis-je pas épisser puis pousser?

var moveZeros = function (arr) { 
  const newArray = arr.map((element, index) => element === 0 ? arr.splice(index, 1).push(element) : console.log(index, element))
}


0 commentaires

3 Réponses :


3
votes

splice renvoie un tableau des éléments supprimés. Si vous faites

const moveZeros = (arr) => {
  const zeros = [];
  return arr
    .filter((elm) => {
      if (elm === 0) {
        zeros.push(0);
        return false;
      }
      return true;
    })
    .concat(zeros);
};

console.log(moveZeros([0, 1, 2, 3]));
console.log(moveZeros([3, 2, 1,0, 1, 2, 3]));

, vous poussez vers le tableau des zéros supprimés (et cette expression est ensuite supprimée immédiatement après).

Vous ne devez pas non plus muter un tableau tout en l'itérant - cela entraînera un comportement très déroutant.

Envisagez de filtrer les zéros, tout en poussant vers un tableau de zéros à la place, puis combinez les deux tableaux par la suite:

arr.splice(index, 1).push(0)


0 commentaires

1
votes

Vous pouvez effectuer un tri à la place et déplacer tous les zéros à la fin. Cette approche repose sur des agents utilisateurs modernes qui conservent un tri stable pour les éléments égaux (les onces whoes callback retournent zéro).

var array = [0, 1, 9, 2, 0, 0, 3, 5, 4, 2];

array.sort((a, b) => !a - !b);

console.log(array)


0 commentaires

4
votes

Array.splice () renvoie un tableau des éléments qui sont supprimés du tableau sur lequel splice () a été appelé. Trouvez la documentation ici: Documentation Array.splice ()

Vous pouvez atteindre votre objectif en suivant l'extrait de code:

let arr = [1, 0, 2, 0, 1, 0, 1, 0, 1, 0]

var moveZeros = function (arr) {
    let zeroes = [];
    let a = arr.reduce((finalArray, element) => {
        element === 0 ? zeroes.push(element) : finalArray.push(element)
        return finalArray;
    }, []);
    return [...a, ...zeroes];
}

console.log(moveZeros(arr));


0 commentaires