121 votes

Réorganisation de tableaux

Dire, j'ai un tableau qui ressemble à ceci :

var playlist = [
    {artist:"Herbie Hancock", title:"Thrust"},
    {artist:"Lalo Schifrin", title:"Shifting Gears"},
    {artist:"Faze-O", title:"Riding High"}
];

Comment puis-je déplacer un élément vers une autre position ?

Je veux déplacer par exemple, {artist:"Lalo Schifrin", title:"Shifting Gears"} à la fin.

J'ai essayé d'utiliser la fonction splice, comme ceci :

var tmp = playlist.splice(2,1);
playlist.splice(2,0,tmp);

Mais cela ne fonctionne pas.

311voto

Matt Points 38395

La syntaxe de Array.splice est:

yourArray.splice(index, howmany, element1, /*.....,*/ elementX);

Où:

  • index est la position dans le tableau à partir de laquelle vous voulez commencer à supprimer des éléments
  • howmany est le nombre d'éléments que vous voulez supprimer à partir de index
  • element1, ..., elementX sont les éléments que vous voulez insérer à partir de la position index.

Cela signifie que splice() peut être utilisé pour supprimer des éléments, ajouter des éléments ou remplacer des éléments dans un tableau, en fonction des arguments que vous passez.

Notez qu'il renvoie un tableau des éléments supprimés.

Quelque chose de générique et agréable serait:

Array.prototype.move = function (from, to) {
  this.splice(to, 0, this.splice(from, 1)[0]);
};

Ensuite, utilisez simplement:

var ar = [1,2,3,4,5];
ar.move(0,3);
alert(ar) // 2,3,4,1,5

Diagramme:

Diagramme de l'algorithme

29voto

CMS Points 315406

Si vous connaissez les indexes, vous pouvez facilement échanger les éléments avec une fonction simple comme ceci :

function swapElement(array, indexA, indexB) {
  var tmp = array[indexA];
  array[indexA] = array[indexB];
  array[indexB] = tmp;
}

swapElement(playlist, 1, 2);
// [{"artist":"Herbie Hancock","title":"Thrust"},
//  {"artist":"Faze-O","title":"Riding High"},
//  {"artist":"Lalo Schifrin","title":"Shifting Gears"}]

Les indexes du tableau ne sont que des propriétés de l'objet tableau, vous pouvez donc échanger ses valeurs.

16voto

chmanie Points 1399

Voici une version immutable pour ceux qui sont intéressés :

function immutableMove(arr, from, to) {
  return arr.reduce((prev, current, idx, self) => {
    if (from === to) {
      prev.push(current);
    }
    if (idx === from) {
      return prev;
    }
    if (from < to) {
      prev.push(current);
    }
    if (idx === to) {
      prev.push(self[from]);
    }
    if (from > to) {
      prev.push(current);
    }
    return prev;
  }, []);
}

13voto

arthurDent Points 308

Avec ES6, vous pouvez faire quelque chose comme ceci :

const swapPositions = (array, a ,b) => {
  [array[a], array[b]] = [array[b], array[a]]
}

let array = [1,2,3,4,5];
swapPositions(array,0,1);

/// => [2, 1, 3, 4, 5]

8voto

Andy E Points 132925

Vous pouvez toujours utiliser la méthode de tri, si vous ne savez pas où se trouve l'enregistrement actuellement:

playlist.sort(function (a, b) {
    return a.artist == "Lalo Schifrin" 
               ? 1    // Déplacez-le vers le bas de la liste
               : 0;   // Gardez-le à sa place
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X