IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Déplacer élément d'un tableau


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 25
    Points : 19
    Points
    19
    Par défaut Déplacer élément d'un tableau
    Bonjour,

    Je suis pas super bon en algorithmique. Je cherche un moyen de déplacer plusieurs lignes d'un tableau avant ou apres dans le tableau.

    tab:
    [0]a
    [1]b
    [2]c
    [3]d
    [4]e

    move(1, 3, 4)//move(start, end, to);

    [0]a
    [1]e
    [2]b
    [3]c
    [4]d

    Avez vous des idées ? Je galère avec les splice() et slice().

    Merci par avance pour votre aide !

  2. #2
    Membre expérimenté
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Points : 1 333
    Points
    1 333
    Par défaut
    Salut,

    Dans ce cas, j'ajouterai ma méthode à Array :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Array.prototype.move = function(start, end, to) {
      var copy = new Array().concat(this);
      var first = copy.splice(0, start);
      var moved = copy.splice(0, end - start);
      var middle = copy.splice(to - end);
      return new Array().concat(first,middle,moved,copy);
    }
     
    var arr = ['a','b','c','d','e'];
    var modified = arr.move(1,3,4);
    console.log(arr , modified );
    Le code que je présente ici fonctionne pour ton cas, mais attention en fonction des valeurs des indices, de déplacements avant après...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    La reconstitution n'est pas bonne.
    Si par exemple tu as : arr.move(1,3,0) ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 25
    Points : 19
    Points
    19
    Par défaut
    Merci pour le coup de main,

    J'avais déjà réalisé cette méthode mais je suis obligé de mettre 3-4 if pour pouvoir traiter tous les cas. En terme d'algo c'était plus que moyen je trouvais.

    Du coup, ma question était plus dans le sens "quelqu'un voit un algo génial qui gère les cas particuliers ?".

    Apparemment ce n'est pas si simple, il va falloir "ifer" .

    Merci pour votre aide, si quelqu'un a un éclair de génie, je suis preneur !

  5. #5
    Membre expérimenté
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Points : 1 333
    Points
    1 333
    Par défaut
    Citation Envoyé par kernelfailure Voir le message
    La reconstitution n'est pas bonne.
    Si par exemple tu as : arr.move(1,3,0) ?
    C'est pour ca que j'ai dit qu'il fonctionnait pour le cas demandé et qu'il fallait faire attention aux indices

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par gwyohm Voir le message
    C'est pour ca que j'ai dit qu'il fonctionnait pour le cas demandé et qu'il fallait faire attention aux indices
    Je n'avais pas fait attention, désolé.

    J'ai une proposition, mais il y a une réaction qui peut choquer ou non, en cas de recouvrement. Il n'y a aucun test de cohérence des paramètres .
    Je modifie la classe proposée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Array.prototype.move = function(start, end, to) {
       var copy = new Array().concat(this.slice(0, start), this.slice(end));
       return new Array.concat( copy.splice(0, to), this.slice(start, end), copy );
    }
    Exemple en cas de recouvrement :
    1,2,3,4,5 ::: s:1 ,e:3 ,d:2
    1,4,2,3,5

    On le voit ici, '4' se trouvant sous '3', il glisse devant '2'.
    C'est un scenario possible.
    On pourrait proposer qu'il ne bouge pas, ou alors, qu'il se fonde dans le bloque.

    EDIT:
    Ceci corrige le phénomène de recouvrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Array.prototype.move = function (s, e, d) {
       var crop = new Array().concat( this.slice(0, s), this.slice(e) );
       return new Array.concat( crop.splice(0, Math.min(d, s) + Math.max(0, d - (e - 1))), this.slice(s, e), crop );
    }

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 25
    Points : 19
    Points
    19
    Par défaut
    Oups, j'avais lâché le fil,

    Super solution, c'est exactement ce genre d'extend compacte que je souhaitais créer.

    Merci encore pour votre aide à tous les deux !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/05/2014, 16h53
  2. Comment déplacer les éléments d'un tableau
    Par pierrot10 dans le forum Langage
    Réponses: 2
    Dernier message: 26/12/2011, 21h17
  3. Déplacer un élément d'un tableau vers un autre sur clic d'un bouton
    Par Lorenzaccio dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 26/09/2011, 17h11
  4. Supprimer un élément d'un tableau
    Par CaptainChoc dans le forum Langage
    Réponses: 15
    Dernier message: 23/12/2002, 23h14
  5. Réponses: 3
    Dernier message: 16/12/2002, 16h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo