Tri automatique

Fermé
Ambi - 18 mars 2017 à 01:51
 Utilisateur anonyme - 21 mars 2017 à 08:13
Bonjour,

Je tiens tout d'abord à préciser que je suis totalement novice dans le domaine. Je travaille sur l'éditeur de script d'un dossier google sheets; j'ai réussi à faire certaine des fonctions (assez simples il est vrai...) que je souhaitais faire mais je bloque sur l'une d'entre elle. Mon but est d'actualiser le tri d'un tableau de taille 9 sur 12 en cliquant sur un bouton (en somme que le tableau se tri dès qu'on appuie dessus !). Mais je ne m'en sors pas du tout. C'est un tableau comportant des chaines de caractères ainsi que des nombres. Mon but étant de le trier en fonction de la colonne 2 puis en cas d'égalité en fonction de la colonne 3 (ces 2 colonnes étant composées de nombres). Quelqu'un sait s'il existe un fonction toute faite capable de réaliser cela ? Ou alors un début de code... ? J'ai vu qu'il existait la fonction "sort", mais je n'arrive pas l'utiliser.

J'espère que quelqu'un pourra m'aider !

Dans l'attente de votre réponse ^^

5 réponses

Utilisateur anonyme
19 mars 2017 à 13:29
Salut,

pourrais tu me montrer un exemple de tableau en question ?
0
Salut !

Celui-ci est à l'image d'un tableau correspondant à un classement de football. Première colonne le nom des équipes, la seconde les points, la troisième le goalaverage, puis le nombre de matchs joués, de victoire, de défaites etc... avec, comme indiqué dans mon premier message 12 colonnes et 9 lignes !
0
voici un exemple de réponse. Il est bien entendu possible de faire plus propre, mais l'exemple serait moins simple à comprendre.

var results = [
  ['PSG', 3, 4],
  ['OM', 2, 5],
  ['Nice', 4, 1],
  ['Lyon', 4, 2],
  ['Nante', 1, 3],
  ['Ménétreux le pitois', 5, 1]
];

var resultSorted = results.sort(function (a, b) {
  if (a[1] < b[1]) return 1;
  else if (a[1] > b[1]) return -1;
  else if (a[2] < b[2]) return 1;
  else if (a[2] > b[2]) return -1;
  else return 0;
});

console.log(resultSorted);

/**
 [ [ 'Ménétreux le pitois', 5, 1 ],
 [ 'Lyon', 4, 2 ],
 [ 'Nice', 4, 1 ],
 [ 'PSG', 3, 4 ],
 [ 'OM', 2, 5 ],
 [ 'Nante', 1, 3 ] ]
 */


si tu souhaite modifier sur plus de colonne, ceci pourrait peut être faire l'affaire. Je pense qu'avant de l'utiliser en production il faut le tester afin d'être certain du fonctionnement.

var results = [
  ['PSG', 3, 4, 7, 4, 5, 3],
  ['OM', 2, 5, 4, 5, 6, 4],
  ['Nice', 4, 1, 7, 5, 2, 6],
  ['Lyon', 4, 1, 7, 5, 2, 4],
  ['Nante', 1, 3, 1, 2, 7, 2],
  ['Ménétreux le pitois', 5, 1, 4, 1, 4, 6, 3]
];

function sortMulti(a, b, i) {
  try {
    i = undefined === i ? 1 : i;
    if (a[i] < b[i]) return 1;
    else if (a[i] > b[i]) return -1;
    else return sortMulti(a, b, (i + 1));
  } catch (e) {
    return 0;
  }
}


var resultSortedMulti = results.sort(sortMulti);

console.log(resultSortedMulti);

/**
 [ [ 'Ménétreux le pitois', 5, 1, 4, 1, 4, 6, 3 ],
 [ 'Nice', 4, 1, 7, 5, 2, 6 ],
 [ 'Lyon', 4, 1, 7, 5, 2, 4 ],
 [ 'PSG', 3, 4, 7, 4, 5, 3 ],
 [ 'OM', 2, 5, 4, 5, 6, 4 ],
 [ 'Nante', 1, 3, 1, 2, 7, 2 ] ]
 */
0
Tout d'abord merci d'avoir pris le temps de me répondre !

Malheureusement, je ne comprends pas les codes, ou du moins partiellement. Dans le premier code, je n'ai pas l'impression que tu définie de fonction... Les fonctions que j'ai réalisé sont très classiques (je parle de convention d'écriture), exemple :

function cptVictoire(tab1, tab2) {
var cpt = 0;
for (var i = 0; i < tab1.length ; i++) {
if (parseInt(tab1[i]) > parseInt(tab2[i])) {
cpt = cpt + 1;
}
}
return cpt;
}

Cela me permet d'aller sur ma cellule dans mon google sheet d'écrire égal le nom de la fonction et de rentrer les paramètres (plages ou cellule) qui m'intéressent. Là je ne comprends pas réellement ce que tu m'as envoyé, tu crées une variable qui dépend d'une fonction... ? Par exemple je ne vois pas à quoi correspond le a et le b, ce sont des colonnes ? Comme je ne veux pas de rendu dans la console, comment faire la fonction ? J'avais pensé à la base à faire des boucles et à échanger les lignes en fonction des comparaisons... j'imagine que ce que tu m'as donnné fait aussi ça mais je ne vois pas comment l'utiliser.
Encore une fois désolé mais j'ai un niveau très faible.. !

Pour rappel, le but final est de pouvoir appuyer sur un bouton qui permette d'actualiser le classement car chacune des autres cellules de ce classement sont aussi dépendantes de fonctions (que j'ai réussit à créer) donc les paramètre changent lorsqu'on modifie certaine valeurs sur d'autres onglets du dossier. Je voudrais donc "attacher" la fonction crée au bouton.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Hello,

Par exemple je ne vois pas à quoi correspond le a et le b, ce sont des colonnes ?


Le a et le b se sont les lignes du tableau. La méthode parcours chaque ligne (a) et la compare avec la ligne suivant (b), si je ne dit pas bêtise.

Tu pourrais faire :

- lorsque tu click sur le bouton :
  • tu parcours le tableau et tu récupère les valeur des lignes et colonnes que tu stock dans un array javascript de la même facon que :


var results = [
  ['PSG', 3, 4, 7, 4, 5, 3],
  ['OM', 2, 5, 4, 5, 6, 4],
  ['Nice', 4, 1, 7, 5, 2, 6],
  ['Lyon', 4, 1, 7, 5, 2, 4],
  ['Nante', 1, 3, 1, 2, 7, 2],
  ['Ménétreux le pitois', 5, 1, 4, 1, 4, 6, 3]
];
  • Ensuite tu le tri avec la méthode sort
  • Tu replace les valeurs dans le tableau.


Exemple :

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table>
    <tr>
        <td>LigneA</td>
        <td>5</td>
        <td>2</td>
        <td>3</td>
        <td>4</td>
        <td>7</td>
        <td>8</td>
        <td>6</td>
        <td>7</td>
    </tr>
    <tr>
        <td>LigneB</td>
        <td>5</td>
        <td>7</td>
        <td>3</td>
        <td>2</td>
        <td>7</td>
        <td>9</td>
        <td>2</td>
        <td>1</td>
    </tr>
    <tr>
        <td>LigneC</td>
        <td>7</td>
        <td>3</td>
        <td>3</td>
        <td>5</td>
        <td>7</td>
        <td>4</td>
        <td>2</td>
        <td>7</td>
    </tr>
    <tr>
        <td>LigneD</td>
        <td>5</td>
        <td>2</td>
        <td>3</td>
        <td>4</td>
        <td>7</td>
        <td>8</td>
        <td>6</td>
        <td>8</td>
    </tr>
    <tr>
        <td>LigneE</td>
        <td>7</td>
        <td>3</td>
        <td>3</td>
        <td>4</td>
        <td>7</td>
        <td>8</td>
        <td>6</td>
        <td>7</td>
    </tr>
</table>

<button id="sort">Sort</button>
<script>

  /** CONFIG */
  var TABLE = 'table';
  var ROW = 'tr';
  var CELL = 'td';
  var START = 1; // start at column 2

  var d = document;
  var button = d.querySelector('#sort');

  function sortMulti(a, b, i) {
    try {
      i = undefined === i ? START : i;
      if (a[i] < b[i]) return 1; 
      else if (a[i] > b[i]) return -1; 
      else return sortMulti(a, b, i + 1);
    } catch (e) {
      return 0;
    }
  }

  function getDatas() {
    var datas = [];
    var table = d.querySelector(TABLE);
    var rows = table.querySelectorAll(ROW);
    rows.forEach(function (r) {
      var tds = r.querySelectorAll(CELL);
      var row = [].slice.call(tds).map(function (t) {
        return t.innerHTML;
      });
      datas.push(row);
    });
    return datas;
  }

  function updateTable(datas) {
    var table = d.querySelector(TABLE);
    var rows = table.querySelectorAll(ROW);
    rows.forEach(function (r, i) {
      var tds = r.querySelectorAll(CELL);
      tds.forEach(function (t, n) {
        t.innerHTML = datas[i][n];
      });
    });
  }

  function sort() {
    var myDatas = getDatas();
    var myDatasSorted = myDatas.sort(sortMulti);
    return updateTable(myDatasSorted);
  }

  /** BIND Event */
  button.addEventListener('click', sort, false);

</script>
</body>
</html>




Je n'ai pas utiliser une feuille google sheet mais un simple tableau html, donc il faudra adapter. N'hésite pas à mettre des console.log pour voir les résultats des instructions.
0