2012-04-30 4 views
1

J'ai un script de tri JS, mais est la commande # 's comme ceci:javascript type grille par numéro, la commande numéro

1. 
10. 
11. 
2. 
3. 
4. 

Je veux qu'ils soient classées par ordre décroissant, comme ceci:

1. 
2. 
3. 
4. 
10. 
11. 

Je ne peux pas comprendre cela. Je sais qu'il existe un moyen de le faire avec MySQL, mais je ne suis pas familier avec javascript. Voici ce que j'ai jusqu'ici, mais c'est ordonner des nombres numériques incorrects. J'apprécie n'importe quelle aide que vous pouvez fournir, ou juste me tirant la bonne direction.

JavaScript:

var Grid = new Class({ 
    /** define some variables */ 
    table: false, 
    headers: false, 
    data: false, 

    /** 
    * Initialize the object 
    */ 
    initialize: function(table){ 
     this.table = table; 
     this.getHeaders(); 
    }, 

    /** 
    * Get the headers 
    */ 
    getHeaders: function(){ 
     this.headers = this.table.getElements('thead tr th'); 
     this.headers.each(function(h, index){ 
      //h.store('asc', false); 
      if (h.hasClass('sort')) h.addEvent('click', function(){ 
       if(h.hasClass('asc')){ 
        h.className = 'sort desc'; 

        //h.addClassName('desc'); 
       }else{ 
        h.className = 'sort asc'; 
        //h.addClassName('asc'); 
       } 
       //if (h.retrieve('asc')) h.store('asc', false); 
       //else h.store('asc', true); 
       //this.sort($('tblrank_id')); 
       this.sort(index); 
      }.bind(this)); 
     }, this); 
    }, 

    /** 
    * Get the table data 
    */ 
    getData: function(){ 
     this.data = this.table.getElements('tbody tr'); 
    }, 

    /** 
    * Sort the data 
    * @param int index 
    */ 
    sort: function(index){ 
     this.getData(); 
     data = []; 
     sortType = this.headers[index].getProperty('axis'); 

     asc = this.headers[index].hasClass('asc');//this.headers[index].retrieve('asc'); 
     if (this.data.length > 0) this.data.each(function(row, i){ 
      cells = row.getElements('td'); 
      if (cells.length < this.headers.length) return false; 
      value = cells[index].innerHTML; 

      if(cells[index].childNodes[0].nodeName.toLowerCase() == "a"){ 
       //alert(cells[index].childNodes[0].innerHTML); 
       value = cells[index].childNodes[0].innerHTML; 
      } 

      if (sortType == 'int' || sortType == 'float'){ 
       if (value.contains('$') || value.contains(',')) value = value.replace(/\$/g, '').replace(/,/g, '').toFloat(); 
       else value = value.toFloat(); 
      } else if (sortType == 'date') value = Date.parse(value); 
      data.push({'index': i, 'value': value, 'row': row}); 
     }, this); 

     if (sortType == 'int' || sortType == 'float' || sortType == 'date') data.sort(this.sortNumeric); 
     else data.sort(this.sortCaseInsensitive); 
     if (!asc) data.reverse(); 

     this.data = []; 
     data.each(function(d, i){ 
      this.data.push(d.row); 
     }, this); 

     this.data.each(function(row, i){ 
      if (row.hasClass('etblraw0')) row.removeClass('etblraw0'); 
      if (row.hasClass('etblraw1')) row.removeClass('etblraw1'); 
      this.table.getElement('tbody').adopt(row.addClass((i % 2 == 0 ? 'etblraw0' : 'etblraw1'))); 


     }, this); 
    }, 

    /** 
    * Sort Numerica Values 
    * @param object a 
    * @param object b 
    */ 
    sortNumeric: function(a, b){ 


     if ($type(a.value) != 'number') a.value = 0; 
     if ($type(b.value) != 'number') b.value = 0; 
     return a.value - b.value; 
    }, 

    sortCaseInsensitive: function(a, b){ 
     a.value = a.value.toLowerCase(); 


     b.value = b.value.toLowerCase(); 
     if (a.value == b.value) return 0; 
     if (a.value < b.value) return -1; 
     return 1; 
    } 
); 
+0

Si vous souhaitez créer exemple travailler en direct sur http://jsfiddle.net il sera très utile. –

Répondre

3

Essayez ceci:

function sortfunc(a,b) { 
    return parseInt(a.split(".")[0]) - 
     parseInt(b.split(".")[0]); 
} 

var list = ["1. first", "2. second", "10. tenth"]; 
list.sort(sortfunc); 

console.log(list); // => ["1. first", "2. second", "10. tenth"] 
+0

essayé de couper et coller cela dans le bas, par la section SortNumeric code ci-dessus. Je ne pouvais pas le faire fonctionner. J'ai ajouté mon code complet. Merci pour l'aide – user1071915

+0

@ user1071915 le problème est que vos numéros sont triés en tant que chaînes. L'appel 'parseInt' est la partie importante de cette réponse. @Riateche pourquoi ne pas simplement utiliser la base, comme 'parstInt (a, 10)'? – fncomp

+0

@Josh Je pense qu'il est plus clair de passer seulement un nombre à 'parseInt' et de couper le reste. Si j'écris 'parseInt (a, 10)', quelqu'un peut penser que j'ai fait une erreur parce que la chaîne 'a' ne représente pas un nombre. –